1.获得类型类
我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。例如,有如下一段代码:
2.类继承之间之间的逻辑关系
类C继承类B,而类B继承类A。那么类C的构造函数是怎么运行的呢?这一点一直疑惑着我。为搞明白这一疑惑,做了如下的尝试、代码如下:
public class Art
{
Art() {
System.out.println("Art");//2
System.out.println(getClass().getName());
}
public void test()
{
System.out.println("Print Art");
}
public void test2()
{
System.out.println("print 2Art");
}
}
public class Drawing extends Art
{
Drawing() {
System.out.println("Drawing");//3
System.out.println(getClass().getName());
}
public void test3()
{
System.out.println("Print Draw3");
}
public void test4()
{
System.out.println("Print Draw4");
}
}
public class Cartoon extends Drawing
{
Cartoon(){
System.out.println("Cartoon");//4
System.out.println(getClass().getName());
}
public void test5()
{
System.out.println("Print Cartoon5");
}
public void test6()
{
System.out.println("Print Cartoon6");
}
public static void main(String[] args) {
Cartoon x = new Cartoon();
System.out.println("=======");
Drawing drawing =new Drawing();
System.out.println("++++++++");
Art art =new Art();
System.out.println("**********");
/* x.test();
x.test3();*/
Drawing one = (Drawing)x;
//one的test5()、test6()的方法都没有了
//one.test5();//出现报错,表示存在test5
Art two = (Art)x;//two只有test()和test2()这两个方法,test3()...test()6的方法都没有了
if(one == two){
System.out.println("==");
}else {
System.out.println("!=");
}
System.out.println(x.toString());
System.out.println(one.toString());
System.out.println(two.toString());
}
}
运行结果如下:
例子2:
Cartoon x = new Cartoon();
System.out.println("=======");
Drawing drawing =new Drawing();
System.out.println("++++++++");
Art art =new Art();
System.out.println("**********");
运行结果:
结论:
1.首先运行:Cartoon x = new Cartoon();但是并没有运行Cartoon的构造函数,而是先运行Cartoon的顶级构造函数Art,在运行父类的构造函数Drawing的构造函数。如红色标记2、3、4.
2.Cartoon x = new Cartoon();x的test、test2、test3--test6方法都可以用。是Drawing one = (Drawing)x,对x进行上溯之后,x继承的方法只有test、test2、test3、test4,而test5、test6都不能用了。同理Art two = (Art)x;x只能有test和test2方法。
3.Drawing one = (Drawing)x和Art two = (Art)x;one和two看似是两个不同的类实例,但是追根索源的话,都是通过Cartoon x = new Cartoon()的x衍生出来的,还是具有相同的内存地址。好似Cartoon 生产了编号为@6d9c的书,包含6章,one只要前4章,后面两章不要了,但是书的编号还是@6d9c,同理解释two。
4. 当调用getClass()时,返回这个对象真实的Class对象。从3个继承对象相等的情况和输出可知,这三个对象有相同的this指针,即内存地址一致。而getClass()返回的就是this指针所代表的最真实的Class的对象,也即最上层的子类。