Java继承易错知识点

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{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值