本文主要内容
1、继承 extends
2、抽象 abstract
3、接口 interface
4、多态
5、instanceof关键字
01 继承 extends
A、继承的格式:class 子类 extends 父类 {}
B、继承注意事项
1、子类继承父类后,将直接拥有父类所有非私有的属性和方法
2、java中类只能单继承,不能多继承,但是可以多层继承(一个类的父类可以再去继承另外的父类)。
class A{}
class B{}
class C extends A,B{} // C类不可以同时继承A类和B类
3、所有的类都直接或间接继承了Object类,多个类可以继承同一个父类
class A{}
class B extends A{}
class C extends A{} // 类B和类C都可以继承类A
4、继承的缺点是,类与类之间耦合度过高
5、子类、父类中出现同名变量或方法时,访问子类中的变量或方法时使用 this关键字,访问父类中的变量或方法时使用super关键字
6、子类的对象调用成员变量的时候,子类自己有,使用子类,子类自己没有调用的父类
C、重写override
1、子类重写(override)父类的方法时,父类的私有方法,子类不能重写。并且override时必须要保证子类权限大于等于父类权限
2、子类方法和要重写的父类的方法:方法的方法名和参数列表都要一样
3、关于方法的返回值:
如果是基本数据类型,子类的方法和重写的父类的方法返回值类型必须相同
如果是引用数据类型,子类的方法和重写的父类的方法返回值类型可以相同或者子类方法的返回值类型是父类方法返回值类型的子类
02 重载与重写
重载:与权限修饰符(public private 默认)无关
方法名:重载的两个方法的方法名必须相同
形参列表:形参类型的顺序不同、形参的个数不同、形参的类型不同。三者至少满足一个
返回值类型:重载与返回值类型无关
重写:
子类方法的权限修饰符>=父类的方法的权限
方法名: 子类方法和父类方法必须相同
形参列表: 子类方法和父类方法的形参列表必须相同
返回值类型:
返回基本数据类型时,子类的方法和重写的父类的方法返回值类型必须相同
返回引用数据类型,子类的方法和重写的父类方法返回值类型可以相同或者子类方法的
03 抽象 abstract
A、抽象类、方法定义的格式
abstract class 类名 { }
public abstract 返回值类型 方法名(参数);
B、抽象类的特点
1、抽象类用abstract修饰,抽象方法必须写在抽象类中
2、抽象类中可以没有抽象方法,可以定义带有方法体的方法
3、抽象方法,没有主体
4、抽象类不能new,只能被继承,然后子类对父类的抽象方法进行重写。如果子类不想重写父类的抽象方法,可以将自己定义为抽象类
5、测试抽象类,只能通过创建他的子类的对象,使用子类的对象调用方法
6、子类要实现抽象类中所有的抽象方法,才能创建子类对象,否则子类还是一个抽象类
7、abstract不可以和private、static、final一起使用。
8、因为抽象需要子类重写,如果父类是私有的,子类就无法重写。
C、抽象类的设计思想:保证继承体系的完整性,面对共性类型操作会更简单
04 接口 interface
A、接口定义格式
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
B、接口定义步骤
1、使用interface代替了原来的class,其他步骤与定义类相同
2、接口中的方法均为公共访问的抽象方法
3、接口中无法定义普通的成员变量
C、接口的特点
1、接口中定义的抽象方法格式为:public abstract 返回值类型 方法名(参数列表)
方法中,修饰符只能为public,如果不写,默认也是public,修饰符public abstract 可以省略
2、接口中不能定义普通的成员变量。只能定义常量,格式为:public static final 数据类型 变量名=值,定义时可以不写修饰符public static final
3、接口中常量的使用,可直接使用接口名.常量
D、接口的实现类
1、类与接口的关系为实现关系,即类实现接口,使用关键字:implements
2、类实现接口的格式
class 类 implements 接口 {
重写接口中方法
}
3、类实现接口的特点
1)接口的实现,需要重写接口中的全部抽象方法
2)实现类中的实现方法的权限必须和接口中一致。实现类中如果没有写方法的权限修饰
符,默认为default
3)如果实现类只实现了接口中的一部分方法,那么这个实现类是一个抽象类
4)一个类可以实现多个接口,并且不存在安全隐患,因为接口中的方法没有方法体,方法
的实现要依赖实现类
5)一个接口可以继承多个接口
E、接口的设计思想:暴露规则,降低耦合,提高扩展性
F、接口常见问题
1、java中有多继承吗?类中只能单继承,接口之间可以多继承
2、一个类如果实现类接口,有几种操作方法?
方法一:实现类是非抽象类,就需要重写接口中所有的抽象方法.
方法二:实现类也声明为抽象类,那么实现类可以不重写接口中的抽象方法。
04 接口和抽象类
A、相同点
1、都不能直接实例化
2、都包含抽象方法
3、都可以被继承
B、不同点
1、抽象类是事物中应具备的功能,接口是事物中的额外功能
2、一个类只能继承一个抽象类,但是可以实现多个接口
3、抽象类中提供非抽象方法的实现,接口只提供抽象方法
4、抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系
接口是这个事物中的额外内容,继承体系是一种 like..a关系
C、二者的选用
1、 优先选用接口,尽量少用抽象类;
2、 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
05 多态
A、多态调用的三种格式
对象的多态调用方式: 父类类型或者接口类型 变量 = new 子类的对象();
1、普通类的继承可以实现多态的引用
2、抽象类的继承可以实现多态的引用
3、接口的实现可以实现多态的引用
B、多态成员特点
多态调用方法时,运行的是子类的重写方法。
1、成员变量:编译用父类,运行用父类
多态引用时,调用成员变量时,编译时参考父类中是否有该变量,如果有编译成功,否则失败。运行时运行的是父类中的变量
简而言之:编译和运行都参考等号的左边。编译运行看左边。
2、成员方法:编译用父类,运行用子类
多态引用时,调用成员方法时,编译时参考父类中是否有该方法,如果有编译成功,否则失败。运行时运行的是子类中的重写的方法
简而言之:编译看左边,运行看右边。
总结:
1、多态调用时,调用的是成员变量无论是静态还是非静态,编译运行都是看父类。
2、多态调用时,调用的是静态方法,编译运行都是看父类,调用的是非静态方法,编译看父类运行看子类的重写方法。
C、多态的转型
1、多态的转型分为:向上转型与向下转型
2、向上转型:当有子类对象赋值给一个父类引用时,便是向上转型
使用格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
3、向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
4、当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。
当要使用子类特有功能时,就需要使用向下转型。在转换之前必须使用instanceof做类型判断。
06 instanceof关键字
A、类的比较:instanceof关键字,判断某个对象是否属于某种数据类型
B、使用格式: boolean b = 对象 instanceof 数据类型;
举例:
Person p1 = new Student(); // 前提条件,学生类已经继承了人类
Person p2 = new Student();
boolean flag = p1 instanceof Student; //flag结果为true
boolean flag2 = p2 instanceof Teacher; //flag结果为false
C、instanceof只能用于有实现关系的类比较