今日内容:
1.多态
2.抽象类
3.接口
4.内部类
多态
!!!!!!!!!!父类不能直接调用子类独有的方法,但是可以访问父类自己多独有的方法.如果对于父子类都有的非静态方法,就编译时调用父类的方法,运行时调用子类的方法,如果是静态方法始终调父类
基本概念
多态主要是指同一种事物表现出来的多种形态.
例子:
饮料:可乐,雪碧,乐虎,红牛,脉动.......
宠物:狗,猫,鸟,乌龟,鱼.......
人:学生,老师,工人....
语法格式:
父类类型 引用变量名 =new 子类类型();
如:Person pw=new Worker();
pw.show();
解析:
在编译阶段调用Person类中的show方法,在运行阶段调用worker类中重写以后的show方法.
多态的效果:
(1)当父类的引用指向子类的对象时,父类的引用可以直接调用父类独有的方法;
(2)当父类的引用指向子类的对象时,父类的引用不可以直接调用子类独有的方法;
(3)对于父子类都有的非静态成员方法来说,编译阶段调用父类版本,运行调用子类重写以后的版本
(4)对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本,因为他与对象无关,他隶属于类层级
多态的意义:
多态的实际意义在于可以屏蔽不同子类的差异性实现通用的编程,但可以调用不同的方法带来不同的结果.
引用数据类型之间的转换:
1.引用数据类型之间的转换分为:自动类新型转换和强制类型转换
其中自动类型转换就是从小范围到大范围之间的转换,也就是子类到父类的转换
其中强制类型转换主要指大范围到小范围之间的转换,也就是父类到子类的转换
3.若转换到的目标类型是子类类型但不是该引用真正指向的子类类型,则编译通过,然后运行阶段发生类型转换异常
4.为了避免第三条的错误发生,可以使用instanceof关键字进行判断,具体格式如下:
instanceof关键字:
判断数据类型
if(变量 instanceof 类型){
代码;
}else{
代码;
}
抽象类(重点)
抽象方法的概念:
抽象方法就是指不能具体实现的方法,也就是没有方法体并使用一个关键字abstract关键字修饰
语法格式:
访问控制符 abstract 返回值类型 方法名称(形参列表);
如:
public abstract oid 方法名称();
抽象类的概念:
抽象类就是指,不能具体实例化的类,也就是不能创建对象并使用abstract关键字修饰
抽象类为其子类"抽象"出了公共的部分,通常也定义了子类所必须具体实现的抽象方法,
注意事项:
1.抽象类中可以有成员变量,构造方法以及成员方法;
2.抽象类中可以有抽象方法也可以没有抽象方法
3.抽象方法只能在抽象类中定义,因为严格来说,有抽象方法并且使用abstract关键字修饰的类才是真正意义上的抽象类
抽象类的实际意义:
抽象类的意义不在于自身创建对象而在于被继承,当一个类继承抽象类后必须重写抽象类中的抽象方法,否则该类也变成抽象类.
也就是说抽象类对于子类具有强制性和规范性,因此叫做模板设计模式.
经验分享:
在以后的开发中推荐使用多态的语法格式,当父类的引用指向子类的对象时,那么父类引用直接调用的所有方法一定是父类拥有的方法,若希望更换子类时,只需要将new关键字后边的内容进行修改,其他地方无需修改,立即生效,从而提高了代码的可维护性.
缺点:父类引用不能访问子类独有的方法,若要访问则需要进行强制类型转换
接口(重点)
基本概念:
接口就是一种比抽象类还抽象的类,体现为所有成员变量都是常量,所有成员方法都是抽象方法,
定义类的关键字是class而定义接口的关键字shiinterface
继承类的关键字是extendserect而实现接口的关键字是implements
类和接口的关系:
类和类之间是继承关系 使用extends关键字表达继承关系 支持单继承
类和接口之间的关系 使用implements表达实现的关系 支持多实现,一个类可以实现多个接口
接口和接口之间的关系 使用extends关键字表达继承关系 支持多继承
注意:
接口只能使用多态类的形式进行new对象(实例可见)
抽象类和接口之间的区别(笔试简答题)
1.定义抽象类的关键字是abstract class 定义接口的关键字是interface
2.继承抽象类的关键字是extends,而实现接口的关键字是implements
3.继承抽象类支持的是单继承,而实现接口可以多实现
4.抽象类中可以有构造方法,而接口中不可以有构造方法
5.抽象类中可以有成员变量,而接口中只可以有常量
6.抽象类中可以有成员方法,而接口中只能有抽象方法
7.抽象类中增加方法可以不影响子类,而接口中增加方法通常都影响子类
8.在jdk1.8开始允许接口中出现非抽象方法,但是需要使用default关键字修饰
匿名内部类(重点)
基本功能:
抽象类和接口不能new对象,我们就用匿名内部类就可以得到抽象类和接口的一个对象
语法格式:
接口/父类类型 引用变量名 = new 接口/父类类型(){方法的重写};
经验分享:
当接口类型的引用作为方法的形参时,实参的传递方式有两种:
1.自定义类实现接口然后创建该类的对象作为实参传递(代码会调用很多次时,使用)
2.使用匿名内部类的语法格式来得到接口类型的引用,作为实参传递(代码使用一次后就不用了,使用)
笔试题:
abstract关键字和final关键字不能同时存在,因为abstract主要是用于继承的而final是终止继承
abstract关键字和static关键字不能同时存在,因为abstract主要用于继承的而static只能应用于本类
abstract关键字和private关键字不能同时存在,因为private因为abstract主要用于继承的而private关键字是私有的,不能被继承