继承和派生
如果想声明一个类继承另一个类,需要使用extends关键字
例子:
public class A {}
public class B extends A{}
构造顺序
子类的构造顺序:编译器会一直上溯到最初类,执行该类构造方法,然后依次执行各子类构造函数,如下;以:A->B->C 顺序来初始化子对象各部分
先执行父类构造方法,再执行子类构造方法,
如果在子类中未显式调用父类构造方法,则编译器会自动调用父类的默认构造方法
继承性
子类不能完全继承父类的所有方法和属性
1 若子类和父类在同一个包内,子类可以继承父类中访问权限设定为public、 protected、 default的成员变量和方法,除了private都可以。
2 若子类和父类不在同一个包内,子类可以继承父类中访问权限设定为public、 protected的成员变量和方法。
换言之:
1、private类型的属性或方法不能被继承
2、public、protected类型的属性或方法一定可以被继承
3、defalut 类型要看子类是否和父类在一个包。
例子:
隐藏和重写
1 属性隐藏
同名
子类对象在寻找方法或成员变量的时候,先搜索子类独有空间,在搜索父类空间
2 方法重写要求:
两同两小一大:
两同:
方法名相同 参数列表一致
两小:
子类返回值类型应该更小或者相等
子类的抛出的异常小于等于父类的抛出的异常类
一大:
子类的访问权限比父类访问权限要大和相等
例子:
1
2
3
总结
(1) 变量只能被隐藏(包括静态和非静态)
(2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量
(3) 静态方法(static)只能被隐藏,不能被重写;
(4) 非静态方法可以被重写;
(5) 不能用子类的静态方法隐藏父类中的非静态方法,否则编译会报错;
(6) 不能用子类的非静态方法覆盖父类的静态方法,否则编译会报错;
super的用法
1 使用super调用父类的构造方法
父类构造方法不能继承 ,所以
只有子类的构造方法采用super调用父类的构造方法,其它方法调用出错
super调用,必须是方法体中的第一条语句,否则出错
2 可以利用super调用父类的属性1和方法
3
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
调用this()必须写在构造方法的第一行,
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super()
所以,不能同时用super和this
关键词final
1、修饰变量,为常量,值不可变;
对基本类型来说是其值不可变,而对 对象属性来说其引用不可再变,引用空间的值是可以改变的
fianl修饰属性必须初始化,初始化只能在初始化可以在两个地方:
一是其定义处、二是在构造函数中。
2、修饰对象,值可变,引用不变;
3、修饰方法,方法不可重写,可被继承(可以直接使用);
即 在声明类中,一个 final 方法只被实现一次
4、修饰类,无子类,不可以被继承,更不可能被重写。
对象的多态性
上转型
因为子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型由系统自动完成。
例如:父类 对象名称=new 子类()
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。
编译时(父类 对象名称)按照父类对象看待,
运行时( new 子类() )实际是子类对象。,输出子类的结果
1 对象的实例变量并不具备多态性。
2 与方法不同的是,类的静态变量和静态方法并不具备多态性
下转型
先new上转型,再下转型(强制)
不能直接new,强制