学习《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