继承.验证用代码.java自学

     学习《Java hexi核心技术》继承这章,学到P177,Class这个类有个返回超类信息的方法 Class getSuperclass() 。当时就想是否可以写个循环将从当前类的所有父类显示出来。因为到这里已经知道Object类是所有类的超类,就想到结束条件就可以用当遍历到Object类时循环结束。

    既然是验证想法,就顺便把学到的内容一起实践一下。这里实践了以下内容:无参构造器,ArrayList,foreach,多态,私有域,静态私有域,继承,封装,Object.equals ,Objects.equals , String.equals 。

其中多态仅用在了定义引用上,并未实际写个方法验证。

通过编写这段代码,发现了自己在学习过程中存在的问题。具体一些问题和记录写在代码的注释中。

最后贴上了运行的结果,对照查看可以理解getClass toString getClass().getName  等等概念。

import java.util.ArrayList;
import java.util.Objects;

public class getSuperNameTest {
    public static void main(String[] args) {
        ArrayList<A> myArrayList = new ArrayList<A>(5);
        myArrayList.add(new A());
        myArrayList.add(new B());
        myArrayList.add(new C());
        for(A m : myArrayList){
            System.out.println("In for; m.getClass().getName() is " + m.getClass().getName() );
            System.out.println("num is " + m.getNum() );
        }
        System.out.println("Now test SuperName()");
        Object o = myArrayList.get(2);
        //if ( o.getClass() == C ){Error:(16, 41) java: 找不到符号
        //  符号:   变量 C
        //  位置: 类 getSuperNameTest
        //  So! 两个类不能用==来比较
        //if ( Object.equals(o.getClass(),C) ) {Error:(16, 41) java: 找不到符号
        //    符号:   变量 C
        //    位置: 类 getSuperNameTest
        //  So! C是类,不是对象,不能作为equals的参数

        //if ( Object.equals(o.getClass().getName(),C.getClass().getName()) ){
        // getClass()不是static方法,是对象的方法,getName()同样。所以无法执行,编译过程即出错了
        //指正上一行的错误,首先出错原因是Object没有equals(a,b)的方法,这是Objects类的方法
                /*
            if ( Objects.equals(o.getClass().getName(),new C().getClass().getName()) ){
                 这句运行的结果是true;判断是应为在内存中存储类名字字符串的地方是一样的。
                 Objects.equals();方法比较的是两个对象引用是否相同,即是否指向同一个对象。
                 我在这里比较的目的是两个对象的类的名字的字符串是否相同,用Objects.equals方法感觉还有不确定性,
                 当然这个不确定性是由于我对细节不够了解造成的。若是实际情况如我上面判断的一样,这种方法可以用。
                 既然我是为了比较字符串是否相等,那么用String.equals方法就可以明确结果。所以语句最终改为以下
                 */
        //if ( String.equals(o.getClass().getName(),new C().getClass().getName()) ){
        //想当然的以为String有equals(a,b)方法,查阅API后,方法是boolean equals(String anObject);所以改为
        if ( o.getClass().getName().equals( new C().getClass().getName() ) ){
            System.out.println("\no.getClass().getName().equals( new C().getClass().getName() ) is true");
        }else {
            System.out.println("\no.getClass().getName().equals( new C().getClass().getName() ) is false");
        }

        System.out.println("\no is " + o + " || o.getClass().toString() is " + o.getClass().toString() +
                    " || o.getClass() is " + o.getClass() + " || o.getClass().getName() is " + o.getClass().getName());
        System.out.println("o.getClass().getSuperclass() is " + o.getClass().getSuperclass() + " ||o.getClass().getSuper" +
                    "class().getName() is " +o.getClass().getSuperclass().getName()  );

        Class aClass = o.getClass();
        do {
            System.out.println();
            System.out.println("aClass is " + aClass +" || aClass.getName() is " + aClass.getName());
            System.out.println("aClass.getSuperclass() is " + aClass.getSuperclass() +
                    " || aClass.getSuperclass()getName() is " + aClass.getSuperclass().getName());
            aClass = aClass.getSuperclass();
        }while( !aClass.getName().equals( new Object().getClass().getName() ) );



    }

}

class A {
    private int num = 1;
    private static int count = 0;

   // public void A(){   构造方法的语法错了 不能加上void
    public A(){
        setNum(5);
        System.out.println("count =" + getCount());
        //setCount(getCount()++); 报错“需要:变量”。说明不能对返回值做++运算
        setCount(getCount()+1);
        System.out.println("It's A() this = " + this + " getNum() = " + this.getNum() );

    }
    public void setNum(int a) {
        this.num = a;
    }
    public int getNum(){
        return this.num;
    }
    public int getCount(){
        return this.count;
    }
    public void setCount( int count){
       this.count = count;
    }
}

class B extends A{
    public B(){
        super();//这句代码为隐式语句,即使不打编译器也会自动加上
        setNum(10);
        System.out.println("count =" + getCount());
        setCount(getCount()+1);
        System.out.println("It's B() this = " + this + " getNum() = "  + this.getNum() );
    }
}

class C extends B{
    public C(){
       // super();
        setNum(100);
        System.out.println("count =" + getCount());
        setCount(getCount()+1);
        System.out.println("It's C() this = " + this + " getNum() = "  + this.getNum() );
    }
}

运行结果

D:\Java\jdk-10.0.1\bin\java.exe "-javaagent:D:\Java\IntelliJ IDEA Community Edition 2018.1.5\lib\idea_rt.jar=10050:D:\Java\IntelliJ IDEA Community Edition 2018.1.5\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\JavaTest\getSuperNameTest\out\production\getSuperNameTest getSuperNameTest
count =0
It's A() this = A@2812cbfa getNum() = 5
count =1
It's A() this = B@506e6d5e getNum() = 5
count =2
It's B() this = B@506e6d5e getNum() = 10
count =3
It's A() this = C@3796751b getNum() = 5
count =4
It's B() this = C@3796751b getNum() = 10
count =5
It's C() this = C@3796751b getNum() = 100
In for; m.getClass().getName() is A
num is 5
In for; m.getClass().getName() is B
num is 10
In for; m.getClass().getName() is C
num is 100
Now test SuperName()
count =6
It's A() this = C@13969fbe getNum() = 5
count =7
It's B() this = C@13969fbe getNum() = 10
count =8
It's C() this = C@13969fbe getNum() = 100

o.getClass().getName().equals( new C().getClass().getName() ) is true

o is C@3796751b || o.getClass().toString() is class C || o.getClass() is class C || o.getClass().getName() is C
o.getClass().getSuperclass() is class B ||o.getClass().getSuperclass().getName() is B

aClass is class C || aClass.getName() is C
aClass.getSuperclass() is class B || aClass.getSuperclass()getName() is B

aClass is class B || aClass.getName() is B
aClass.getSuperclass() is class A || aClass.getSuperclass()getName() is A

aClass is class A || aClass.getName() is A
aClass.getSuperclass() is class java.lang.Object || aClass.getSuperclass()getName() is java.lang.Object

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/weixin_42583286/article/details/81143552