PS:今天群里一个小伙伴笔试,匆匆发来的求助信息。。。
1.父类、子类之间代码块与构造方法
package com.web.test2;
public class HelloA {
static{
System.out.println("static A");
}
{System.out.println("I'm A class");}
public HelloA(){
System.out.println("HelloA");
}
public HelloA(String s){
System.out.println(s+"HelloA");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloB extends HelloA{
public HelloB () {
//只能调用一个父类的构造方法
// super();
super("parent");
System.out.println("HelloB");
}
{System.out.println("I'm B class");}
static{
System.out.println("static B");
}
}
执行结果:
static A
static B
I’m A class
parentHelloA
I’m B class
HelloB
总结:代码块于构造方法之前执行,静态于非静态之前,另外,静态代码块只执行一次。
2.父类、子类与super()
public class People {
String name;
public People() {
System.out.println(1);
}
public People(String name) {
System.out.println(2);
this.name = name;
}
}
class Child extends People{
People father;
public Child () {
//super()系统会默认添加的
System.out.println(4);
}
public Child (String name) {
//super()系统会默认添加的
System.out.println(3);
this.name = name;
father = new People(name+":F");
}
public static void main(String[] args) {
new Child("mike");
}
}
故执行结果:132
另外一个难缠的实例:
public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
- result as follows :
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数