day09多态、接口、抽象类

来源:互联网 发布:摄像头软件 编辑:程序博客网 时间:2024/06/07 01:09

图片可能看不清,右键另存到桌面上打开就清晰了

多态:继承+方法重写+父类引用指向子类对象

这里写图片描述

多态中的成员变量的访问:编译看左面,运行看左面
Father f=new Son(); 因为使用Father类型做引用来指向new son()的地址,所以他只能访问到它自己的成员变量,所以结果为10
Son s=new Son(); s指向对象的内存地址,因为它有自己的num,所以运行时就用自己的num,而不是父类father的num(就近原则),所以结果为20
这里写图片描述

多态中非静态成员方法的的访问:编译看左边,运行看右面
Father f=new Son(); f.print(); java编译时,要看左边,也就是Father类,如果Father类中没有print()方法就会编译出错(找不到该方法),而运行时会去找子类中重写的该方法!!!所以多态也叫动态绑定,输出结果为 son。也就是说,用父类引用指向子类对象,如Father f=new Son(); 访问成员方法时,会去访问子类中重写的该方法(父类中必须存在该方法,不然编译出错)。如果子类中不存在print()方法,就访问父类自己的print()方法,输出结果为 father。
Son s=new Son(); s.print() ; 这样的话就回去访问son自己的print()方法,没啥说的,结果为 son。
这里写图片描述

多态中静态成员方法的的访问:编译看左边,运行看左面
非静态方法是动态绑定,静态方法就不会动态绑定,而且静态方法是和类相关的,Father类的print方法是属于他自己的,Son类的也是,根本不是重写!!! 所以f.print();其实就是Father.print();
这里写图片描述

如果是接口,道理也是一样:
Collection list=new ArrayList();
list.add(“hello”); 这里编译用的是Collection中的方法,(eclipse中alt+/会提示是Collection下的方法)。
而运行时一定是ArrayList中的方法,因为Collection中的方法都是抽象的!!

转型:子类对象可以默认转化为父类对象,但是反过来要进行强制转换。转型可以访问子类或父类特有的方法!如,Person p=new SuperMan(); 当我要访问fly()方法时,就要向下转型!
这里写图片描述

多态的好处:可以接收任意子类对象
弊端:不能使用子类特有的属性和行为(向下转型就可以访问啦!)
这里写图片描述

这里写图片描述

抽象类:
不能new去实例化,所以由具体的子类去实例化,这也是多态:抽象类多态
抽象类的特点,为什么要有抽象类!!
这里写图片描述

面试题:
abstract不能和static共存:因为抽象方法是static静态的,就可以用类名去访问了,这样抽象类就没意义了;
abstract不能和final共存:因为被final修饰的方法不能被子类重写,而子类继承抽象类一定要重写所有父类的抽象方法(除非这个子类也是抽象类),这是矛盾的;
abstract不能和private共存:被abstract修饰的方法是为了让子类看到并强制重写,而被private修饰的方法,是继承不了的,也是矛盾的。
这里写图片描述

接口(对外提供规则)!!!
就像java访问数据库,sun公司提供了接口,其余的具体怎么实现由各厂商自己来写api(如jdbc xxxx等等)
这里写图片描述

接口(拓展功能)和抽象类(共性功能)的区别:
这里写图片描述