继承体现的关系: 继承体现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修饰的类不能再被继承。
浙公网安备 33010602011771号