当类加载器需要加载某个类时,类加载器会在加载初始化后生成该类的一个类对象(Class),用于描述该类的元数据信息等。在其后的连接过程中,会初始化该类的静态成员(变量或静态初始化器),静态初始化变量和初始化器按照先后顺序执行初始化。例如 static int a = 10 ; static{a=100};这样初始化后a=100。类加载器初始化(不同于构造方法)时,后递归初始整个继承树,及最先初始化的是顶层类,引用类。
当生成一个对象时(即实例化),系统会为这个对象(实例)的属性进行默认初始化(规则与动态初始化数组一致)。实例化也会递归整个继承树。
一旦程序员提供了自己的构造器(构造方法),则系统就不在提供默认的构造方法(构造器,也即默认无参构造器)。
当子类覆盖父类的方法后,就不能直接访问父类的同名方法了,这是可以借助super来访问被覆盖的父类的属性或方法;也可以通过类名来访问被覆盖的方法火属性(类属性或类方法 即static)
多态:
如实例方法不同,对象的属性及类的静态方法不具有多态性。
实例代码:
package lesson3;
class Test extends Animal
{
String age = "年龄";
public static void main(String[] args)
{
Animal a = new Animal();
System.out.println("a.age = "+a.age);
a.common();
a.test();
a.mystatic();
Test t = new Test();
System.out.println("t.age = "+t.age);
t.common();
t.test();
t.mystatic();
Animal pa = new Test();
System.out.println("pa.age = "+pa.age);
pa.common();
pa.test();
pa.mystatic();
//pa.sub();
}
public Test()
{
super();
//System.out.println("Test无参数构造方法");
}
void test()
{
System.out.println("Test中的test方法,覆盖了Animal中的test方法!");
}
static void mystatic()
{
System.out.println("Testl中的mystatic静态方法!");
}
void sub()
{
}
}
class Hoo
{
public Hoo()
{
//System.out.println("Hoo无参数构造方法!");
}
}
class Animal extends Hoo
{
int age= 10;
public Animal(int age)
{
this.age = age;
//System.out.println("Animal有参数构造方法,参数age="+this.age);
}
public Animal()
{
this(100);
//System.out.println("Animal无参数构造方法,此时age="+age);
}
void common()
{
System.out.println("Animal普通方法!");
}
void test()
{
System.out.println("Animal将被覆盖的方法!");
}
static void mystatic()
{
System.out.println("Animal将被覆盖的mystatic静态方法!");
}
}
结果:
通过引用变量来访问她所包含的属性和静态方法是,系统总是系统访问她编译时类所定义的属性或静态方法,而不是运行时类所定义的。
例如:Person p = new Person(); Object o = p;o为编译时类型(即Object),后一个p为运行时类型即Person。