Java继承
- private 的变量和方法不能被子类直接调用,但是子类可以用setter和getter对private变量进行操作
- protect 的变量和方法可以被子类直接调用,但是不可以被非子类调用
- public 则没有限制
抽象类和接口的区别
抽象类和接口一样不能被实例化,但是尤其如下区别:
接口(interface) | 抽象类(abstract class) | |
---|---|---|
变量 | 接口中的变量默认是且只能是public static final(即常量,必须赋初值) | 对定义的变量没有限制 |
方法 | 只有抽象方法(public abstract修饰),java 1.8中可以定义default方法体 | 抽象类可以有定义与实现方法 |
使用 | implements,一个类可实现多个接口 | extends,一个类仅能继承一个类,abstract class除了不能实例化和可以写抽象方法外,和class没有区别,甚至可以继承自class |
意义 | 接口代表功能或能力(如:Runnable、Serializable),琴棋书画可以设计为四个接口 | 抽象类用来提取重复代码,让代码写且只写一次 |
静态代码的执行顺序
重载详解
事实上子类的变量和方法并不会覆盖父类的同名变量和方法,但调用的时候会优先调用子类的变量。
例子如下:
public class MyA {
private int sameField;
public int getSameField() {
return sameField;
}
public void setSameField(int sameField) {
this.sameField = sameField;
}
@Override
public String toString() {
return "MyA [sameField=" + sameField + "]";
}
}
public class MyB extends MyA{
private int sameField;
public int getSameField() {
return sameField;
}
public void setSameField(int sameField) {
this.sameField = sameField;
super.setSameField(sameField-1);
}
@Override
public String toString() {
return super.toString()+"MyB [sameField=" + sameField + "]";
}
public static void main(String[] args) {
MyA b = new MyB();
b.setSameField(10);
System.out.println(b);
}
}
运行结果:
想要了解更多细节可以自行Debug单步调试观察变量的值