Java继承知识点
此文大多总结于《thinking in Java》
子类,导出类,派生类
父类,基类,超类
1. 当创建一个类,总是在继承;若无明确指出要从其他类中继承,否则都会隐式继承Object类。
2. 下面来一段代码
public class t1 extends t2{
public void f2() { //重写f2()
append("t2.f2 ");
super.f2(); //调用基类f2()方法
}
public void f3() {
append("f3 ");
}
public static void main(String[] args) {
t1 t = new t1();
t.f2();
t.f3();
System.out.println(t.str);
t2.main(args); //调用并执行基类main方法
}
}
class t2{
String str = "t ";
public void append(String a) {
str += a;
}
public void f2() {
append("f2 ");
}
public static void main(String[] args) {
t2 t = new t2();
t.f2();
System.out.println(t.str);
}
}
//输出结果:
//t t2.f2 f2 f3
//t f2
1). 可以为每个类都创建一个main()方法,但只有命令行所调用的那个类的main()方法会被调用。
2). 从此例中的方法 f2() 可以看出,使用从基类继承的方法并修改是可行的,且Java提供关键字 super 表示基类,super.f2() 将调用基类的 f2() 方法。
3. 初始化
从外部看,导出类就像是与基类具有想同的接口并多出来几个方法和域,但继承并不只是复制基类接口; 当创建导出类的对象时,其实该对象包含了一个基类的子对象,这个子对象与用基类直接创建出来的对象是一样的。
所以对基类子对象的初始化也是必要的,而且也只有一种方法保证这一点:在构造器中调用基类构造器进行初始化(基类构造器具有初始化基类的所需全部需求)
public class t1 extends t2{
public t1(int i) {
super(i);
System.out.println("t1 Constructor");
}
public static void main(String[] args) {
t1 t = new t1(11);
}
}
class t2 extends t3{
public t2(int i) {
System.out.println("t2 Constructor");
}
}
class t3{
public t3() {
System.out.println("t3 Constructor");
}
}
//输出
//t3 Constructor
//t2 Constructor
//t1 Constructor
1): 可以看出:基类在导出类构造器可以访问之前就已经完成了初始化(导出类第一行默认插入基类构造器的调用)。
2): 导出类构造器会默认调用基类 无参构造器 ,但若基类无 无参构造器 ,则需用 super 调用基类 带参构造器 。
3): 子类不能继承父类构造器。
4. 重载和重写
public class t1 extends t2{
public float m(float f) {//重写
System.out.println("float1");
return f;
}
public static void main(String[] args) {
t1 t = new t1();
t.m('a');
t.m(1);
}
}
class t2{
public float m(float f) {
System.out.println("float2");
return f;
}
public char m(char c) {//重载
System.out.println("char");
return c;
}
}
//输出
//char
//float1
在Java中,子类和父类的重载方法都是可用的,但方法重写后父类的就会被覆盖。
5. protected关键字
提供包内访问权限,就继承与此类的导出类和同一个包内的其他类而言是 public的;
其他情况下是 private。
6. final,static关键字
final:意为终结类,无法被继承。
static:意为静态方法,无法被继承。
7. Java是单继承,每个子类只有一个直接父类。
8.
覆盖方法的权限不能比被覆盖方法的权限严格
访问权限:public>protected>default>private
9.向上转型
可以理解为t1对象同时也是一种t2对象
public class t1 extends t2{
public static void main(String[] args) {
t2 t = new t1();
}
}
class t2{
}