继承
如果多个类中具有共性的内容,就把这些内容提取出来,放到一个类里面.
那么该体系其他的类只要继承这个类,那么就应该可以拥有这些共性内容了.
格式:
class Student extends Person
{
// ...
}
好处:
提高代码的复用性
使类与类之间产生了一个关系,是多态的前提.
特点:
java中的类只支持单继承, 避免多继承产生的调用不明确.
支持多层(重)继承.
子类继承了父类,那么子类就拥有了父类非私有的成员,子类不能继承父类私有的成员.
什么时候定义继承:
两个类之间体现的是 is a 的关系.
尽量不要为了使用部分功能而继承.
变量的使用
使用变量时,变量的寻找范围是什么?
局部 -- 成员 -- 父类 -- 报错
在局部位置想分别输出本类成员变量和父类成员变量的值?
成员 this.变量名
父类 super.变量名
this 和 super
this 本类对象的引用
super 父类在内存中空间的标识.(可以理解成父类对象的引用)
class Fu
{
show()...
}
class Zi extends Fu
{
@Override
show()...
public void fun() {
super.show();
}
}
Zi zi = new Zi(); // 此处创建了Zi类的对象.
zi.fun();
应用:
构造方法中:
this(参数) -- 根据给定的参数去匹配使用本类中其他的某个构造方法
super(参数) -- 根据给定的参数去匹配使用父类中某个构造方法
成员方法
this.方法名() -- 调用本类的方法
super.方法名() -- 调用父类的方法
方法的重载和重写
重写概念:
当子类中出现与父类中方法声明完全相同的情况,称为方法的重写。
重载和重写区别:
方法重载:在同一个类中(这个是重点),出现方法名相同,参数列表不同的多个方法。与返回值类型无关。
方法重写:在子父类间,出现方法声明完全相同(返回值类型、方法名、参数列表等)都相同的两个方法,称为重写。
@Override -- 方法的上面, 这个方法就是重写父类的.
需要注意的问题:
父类中的私有方法不可以被重写。
子类方法访问权限一定要大于等于父类方法访问权限
访问权限修饰符从小到大:
private -- 默认(什么也不写) -- protected -- public
静态的方法只能被静态方法重写。这个其实不能算对象的关系。
如果想使用父类被覆盖的功能,可以使用 super.方法名() 来调用.
覆盖的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,
可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。(用自己的话解释沿袭了父类的功能,定义了子类特有的内容)
带子父类关系的构造方法的执行
1) 子类构造方法都默认访问了父类的无参构造
原因: 构造方法的第一行默认都有一个super()语句.
目的: 是为了对父类的成员进行初始化.
2) 如果父类没有无参构造,怎么办?
用super(参数) 去使用父类中存在的带参构造.
用this(参数) 去使用本类中其他的构造,是因为这个构造可以访问父类的某一个构造.
代码块的执行顺序问题
静态代码块: 就是用static修饰的一对{}
static
{
// ....
}
如果仅在一个类:
静态代码库 -- 构造代码块 -- 构造方法
静态代码块仅执行一次, 但是构造代码块每次创建对象都会执行
如果是具有子父类关系的两个类:
父类的静态代码块 -- 子类的静态代码块 -- 父类构造代码块 -- 父类的构造 -- 子类构造代码块 -- 子类的构造
静态代码块仅执行一次, 但是构造代码块每次创建对象都会执行.
子类使用父类私有成员的方式
1) 通过父类提供的公共的getters 和 setters 方法
2) 通过父类提供的带参数的构造方法, 并且构造方法里面要对私有成员属性进行赋值.
-- 提供了显示的构造方法后,默认的无参构造可以不给(只要你用不到), 建议给上,是因为,可能会用到.
可以通过提供公共的getter和setter来供子类使用,也可以通过公共的构造方法,供子类使用。
基础思想都是一致的:对于私有的成员,除了在能所属类中使用之外,不能在其他任何地方直接使用。
但是可以在所属类中定义公共的访问方式,然后外界通过这种公共的访问方式供其他类或者对象使用。
fianl关键字
修饰类 -- 类不能被继承
修饰成员方法 -- 方法不能被重写
修饰成员变量 -- 变量其实是一个常量.
finally关键字
finalize() 方法
|