继承体现的关系: 继承体现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 最终类