class A {
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A{
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Hello {
public static void main(String[] args) {
A ab = new B();
ab = new B();
}
}
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A{
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Hello {
public static void main(String[] args) {
A ab = new B();
ab = new B();
}
}
答:执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。
第一次调用函数,static变量,初始化。
第二次,及以后,调用函数,static变量,不会初始化。
第二次,及以后,调用函数,static变量,不会初始化。
一般情况下,需要用到某个类的时候,都必须先实例化这个类,才能对其进行调用。
static修饰的类成为静态类,静态类中只能包含静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中可以包含静态成员。
说明:ClassA类为非静态类,但其中的方法Fun()为静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。
说明:ClassA类为非静态类,但其中的方法Fun()为静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。
3、static修饰符(拓展):
(1) 用来修饰类或类的成员,这时不需要创建实例就能访问(而且不能实例化),在被调用的时候自动实例化,且在内存中产生一个实例。当含有静态成员的非静态类实例化出对象后,这些对象公用这些静态成员,通过类名或对象名都能访问它们。