错题(父类构造器)

What will be printed when you execute the following code?
 
class C {
    C() {
        System.out.print( "C" );
    }
}
 
class A {
    C c = new C();
 
    A() {
        this ( "A" );
        System.out.print( "A" );
    }
 
    A(String s) {
        System.out.print(s);
    }
}
 
class Test extends A {
    Test() {
        super ( "B" );
        System.out.print( "B" );
    }
 
    public static void main(String[] args) {
        new Test();
    }
}
 
answer:
CBB
 
解析
首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,可是该类继承自A,因此要先调用父类的构造方法,这里经过super("B")显示 的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,因此调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造
 
重载:
重写是子类继承父类方法并对其进行修改,可选择调用父类方法或子类重写后的同名方法
重载是在一个类能够存在同名但参数列表不一样的方法,可根据传入的参数调用相应的方法
 
 
volatile:

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰以后,那么就具有了两层语义:java

1)保证了不一样线程对这个变量进行操做时的可见性,即一个线程修改了某个变量的值,这新值对其余线程来讲是当即可见的。缓存

2)禁止进行指令重排序。多线程

volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取。this

而对该变量的修改,volatile并不提供原子性的保证。spa

因为及时更新,极可能致使另外一线程访问最新变量值,没法跳出循环的状况线程

多线程下计数器必须使用锁保护。code

相关文章
相关标签/搜索