详解java继承

继承体现的关系: 继承体现is-a关系,例如:B是一个A,则可用继承表示二者关系。

继承的作用:将所有子类共有的属性和方法定义在父类中,子类通过继承获得这些属性和方法,实现代码复用。

java中继承的关键字:extends

语法:

[public|abstract|final] class B extends A{

非内部类的修饰符只有三种,或者不加修饰符。

1、java中继承的特点:

1.1、单一继承:一个子类只能继承一个父类;一个父类可以有多个子类。

class A {}

class B extends A{}

class C extends A{}

class D extends A,B{} //报错,因为只能继承一个父类

1.2、Object是所有类的根,假如一个类没有写extends,则默认继承Object。

1.3、继承可以传递:子类可以获得所有父类(直接或间接)的属性和方法。

当属性和方法存在同名问题时,具体使用的是谁的方法和属性,要具体分析,详情参考java的多态特性:详解java多态;

2、继承中的构造函数问题(本章重点):

2.1在子类的构造函数中,调用父类的构造函数

分为三种情况:

2.1.1 在子类构造函数的第一行,用super(参数列表)调用父类的某个构造函数,或者用this(参数列表)调用自己的某个构造函数。

public class Test extends TestB{
	public static void main(String[] args){
		B b = new B();//实例化一个B类对象
	}
}

class A {
	public A(){
		System.out.println("A的无参构造");
	}
	public A(int a){
		System.out.println("A的含参构造" + a);
	}
}


class B extends A{
	public B(){
		this(10);
		System.out.println("B的无参构造");
	}
	
	public B(int a){
		super(20);
		System.out.println("B的含参构造" + a);
	}
}

输出结果为:
A的含参构造20
B的含参构造10
B的无参构造

2.1.2 super()的隐式调用:假如构造函数中第一行没有写super()或者this(),此时编译器会添加一个隐式的super(),递归调用父类的无参构造函数,直到Object。

public class Test extends TestB{
	public static void main(String[] args){
		B b = new B();
	}
}

class A {
	public A(){
		System.out.println("A的无参构造");
	}
	public A(int a){
		System.out.println("A的含参构造" + a);
	}
}

class B extends A{
	public B(){
		System.out.println("B的无参构造");
	}
	
	public B(int a){
		System.out.println("B的含参构造" + a);
	}
}

输出结果为:
A的无参构造
B的无参构造

2.1.3如果父类没有无参构造函数,那么它也不能有   含参构造函数。(注意这句话的两个条件:1.它是个父类  2.它没有无参构造函数)

public class Test extends TestB{
	public static void main(String[] args){
		B b = new B();
	}
}

class A {
}

class B extends A{
	public B(){
		System.out.println("B的无参构造");
	}
	
	public B(int a){
		System.out.println("B的含参构造" + a);
	}
}
输出结果为:
B的无参构造

特别注意:如果A类加上一个含参构造函数,子类继承时会报错

class A {
	public A(int a){
		System.out.println("A的含参构造" + a);
	}
}

class B extends A{
	public B(){ //报错:A()没有定义
		System.out.println("B的无参构造");
	}
	
	public B(int a){ //报错:A()没有定义
		System.out.println("B的含参构造" + a);
	}
}
3、abstract抽象类

语法:

[public] abstract class C{  
	[public|protected] abstract void say();  //默认是protected
}

用法:

abstract class C{ //抽象类C
	public abstract void say(); //public 修饰的抽象方法
	protected abstract A show(); //protected修饰的抽象方法
public void laugh(){      //非抽象方法
System.out.println("哈哈哈");
}
}

class D extends C{ //继承抽象类,必须实现抽象类中所有的抽象方法

	@Override
	public void say() { //抽象类中,该方法为public,则子类中只能为public
		// TODO Auto-generated method stub
		
	}

	@Override
	public A show() {  //由于抽象类中,该方法为protected,所以子类中可以为public或者protected
		// TODO Auto-generated method stub
		return null;
	}
}

注意:abstract不能与private、static同用。

4、final 最终类
final修饰的类不能再被继承。
原文地址:https://www.cnblogs.com/mengfff/p/6764787.html