【Java篇03】具体类 & 抽象类 & 接口 —— 继承extends & 实现Implement小结

一、具体类 & 抽象类 $ 接口

从组成上来看:
具体类包含:属性、构造器、具体方法、初始化块(静态语句块static{ } 、动态语句块{ })、内部类 ;
抽象类包含:属性、构造器、具体方法、抽象方法(需要用public abstract修饰);
接口包含:属性、抽象方法(一般省略public abstract,直接用void);

★ 这部分的知识点和易混淆点小结如下:

  1. 具体类可以继承(extends)抽象类,抽象类(extends)也可以继承抽象类;

  2. 接口由具体类实现(Implements),接口中的属性为全局变量(final量);

  3. 抽象类不能创建对象,无法实例化;

  4. 抽象类中可以包含抽象方法,但不是必须的

  5. 抽象方法没有方法体,无法执行;

  6. 子类继承父类时,可以继承(除了构造器、静态属性、静态方法)外的所有属性和方法;

  7. 子类继承并拥有父类的private属性和方法,但无法直接调用(访问)
    对于父类的private属性,子类可以通过set和get方法调用;
    对于父类的private方法,子类key通过反射的途径调用;

  8. 子类不能继承父类的static属性和方法,但是可以直接通过子类/子类对象,进行调用
    子类/子类对象 . 父类的static属性;
    子类/子类对象 .父类的 static方法;

  9. 父类中的抽象方法,子类中必须重写;

  10. 父类中的非抽象方法,子类可以重写也可以不重写,不重写也具有,只是隐藏了 ;

  11. 子类中的构造器中默认有super( ),很多时候隐藏了,但是编译的时候是默认其存在的;例如下面的代码题

public class Test {
	public static void main(String[] args) {
		Base b1 = new Base();
		Base b2 = new Sub();
	}
}
class Base{
	Base(){
		method(100);
	}
	public void method(int i){
		System.out.println("base : " + i);
	}
}
class Sub extends Base{
	Sub(){
		super.method(70);
	}
	public void method(int j){
		System.out.println("sub : " + j);
	}
}

打印结果是:

base : 100
sub : 100
base : 70

分析如下:

  1. 首先main方法是入口,先new一个Base( )对象,调用Base方法,执行构造器中的方法体method(100),打印输出base:100

  2. 然后再new一个Sub( )对象,Sub是Base的子类,重写了父类的method方法,所以在Sub类的代码
    Sub(){
    super.method(70);
    }
    之上其实隐藏了一个super( ),即父类的无参构造器;

  3. 首先调用super( ),即
    Base(){
    method(100);}
    }在Sub中重写的method方法,打印输出sub:100

  4. 最后执行
    Sub(){
    super.method(70);
    },这里面super是指父类,即在父类中调用method方法,打印输出base:70

猜你喜欢

转载自blog.csdn.net/wx1528159409/article/details/83588864