单纯地去读这些代码容易迷糊,但对于了解(复习)java程序的相关知识点很有作用
子类父类资源初始化顺序
不看结果,试着想下输出的结果是什么
Super.java
/**
* Created by Huangxiutao on 2017/7/25.
*/
public class Super {
//静态变量
static int i=10;
//静态代码块
static {
System.out.println("父类静态代码块执行》》》父类静态变量的值:"+i);
}
//构造函数
public Super(){
System.out.println("父类构造函数执行》》》");
}
//普通函数
public void f(){
try {
System.out.println("父类函数f执行》》》");
} finally {
System.out.println("父类普通函数f的finally块执行》》》");
}
}
//普通代码块
{
System.out.println("父类普通代码块执行》》》父类静态变量的值:"+i);
}
}
Sub.java
/**
* Created by Huangxiutao on 2017/7/25.
*/
public class Sub extends Super {
static int j=5;
//子类静态代码块
static {
System.out.println("子类静态代码块执行》》》子类静态变量的值:"+j);
}
//子类构造函数
public Sub(){
System.out.println("子类构造函数执行》》》");
}
//子类普通的方法
public void foo(){
System.out.println("子类普通函数执行》》》");
}
//继承的方法
@Override
public void f() {
try {
System.out.println("子类继承父类的方法执行》》》");
} finally {
System.out.println("子类普通函数f的finally块执行》》》");
}
}
//普通代码块
{
System.out.println("子类普通代码块执行》》》子类静态变量的值:"+i);
}
public static void main(String[] args){
Super s=new Sub();
s.f();
}
}
执行结果:
父类静态代码块执行》》》父类静态变量的值:10
子类静态代码块执行》》》子类静态变量的值:5
父类普通代码块执行》》》父类静态变量的值:10
父类构造函数执行》》》
子类普通代码块执行》》》子类静态变量的值:10
子类构造函数执行》》》
子类继承父类的方法执行》》》
子类普通函数f的finally块执行》》》
顺序:父类静态代码块》子类静态代码块》父类普通代码块》父类构造函数》子类普通代码块》子类构造函数
多态:父类引用指向子类对象(本例中s是Super引用,但是指向的是Sub,因此Sub中如果覆盖了Super中大方法,那s调用的将是Sub中覆盖的方法)
结合try-catch-finnally
public class Test {
public static void main(String[] args){
System.out.println(new B().getValue());
}
static class A{
protected int value;
public A(int value){
setValue(value);
}
public void setValue(int value){
this.value=value;
}
public int getValue(){
try {
value++;
return value;
} finally {
this.setValue(value);
System.out.println(value);
}
}
}
static class B extends A{
public B(){
super(5);
setValue(getValue()-3);
}
public void setValue(int value){
super.setValue(2*value);
}
}
}
输出结果:
22
34
17
上图:关于try-catch-finally执行顺序参见另一篇博客