一、具体类 & 抽象类 $ 接口
从组成上来看:
具体类包含:属性、构造器、具体方法、初始化块(静态语句块static{ } 、动态语句块{ })、内部类 ;
抽象类包含:属性、构造器、具体方法、抽象方法(需要用public abstract修饰);
接口包含:属性、抽象方法(一般省略public abstract,直接用void);
★ 这部分的知识点和易混淆点小结如下:
-
具体类可以继承(extends)抽象类,抽象类(extends)也可以继承抽象类;
-
接口由具体类实现(Implements),接口中的属性为全局变量(final量);
-
抽象类、接口不能用new关键词创建对象,但是可以创建对象,用匿名内部类;
-
抽象类中可以包含抽象方法,但不是必须的;
-
抽象方法没有方法体,无法执行;
-
子类继承父类时,可以继承(除了构造器、静态属性、静态方法)外的所有属性和方法;
-
子类继承并拥有父类的private属性和方法,但无法直接调用(访问);
对于父类的private属性,子类可以通过set和get方法调用;
对于父类的private方法,子类key通过反射的途径调用; -
子类不能继承父类的static属性和方法,但是可以直接通过子类/子类对象,进行调用;
子类/子类对象 . 父类的static属性;
子类/子类对象 .父类的 static方法; -
父类中的抽象方法,子类中必须重写;
-
父类中的非抽象方法,子类可以重写也可以不重写,不重写也具有,只是隐藏了 ;
-
子类中的构造器中默认有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
分析如下:
-
首先main方法是入口,先new一个Base( )对象,调用Base方法,执行构造器中的方法体method(100),打印输出base:100;
-
然后再new一个Sub( )对象,Sub是Base的子类,重写了父类的method方法,所以在Sub类的代码
Sub(){
super.method(70);
}
之上其实隐藏了一个super( ),即父类的无参构造器; -
首先调用super( ),即
Base(){
method(100);}
}在Sub中重写的method方法,打印输出sub:100; -
最后执行
Sub(){
super.method(70);
},这里面super是指父类,即在父类中调用method方法,打印输出base:70。