谁能帮我把这个java代码分析一下我被绕晕了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁能帮我把这个java代码分析一下我被绕晕了相关的知识,希望对你有一定的参考价值。

public class PolyDemo09
public static void main(String[] args)
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();

System.out.println("⑴ " + a1.show(b));
System.out.println("⑵ " + a1.show(c));
System.out.println("⑶ " + a1.show(d));
System.out.println("⑷ " + a2.show(b));
System.out.println("⑸ " + a2.show(c));
System.out.println("⑹ " + a2.show(d));
System.out.println("⑺ " + b.show(b));
System.out.println("⑻ " + b.show(c));
System.out.println("⑼ " + b.show(d));




class A
public String show(D obj)
return ("A and D");

public String show(A obj)
return ("A and A");



class B extends A
public String show(B obj)
return ("B and B");

public String show(A obj)
return ("B and A");




class C extends B


class D extends B


这是我运行的结果但是我分析不出来为什么这样

//哈哈,感觉这道题真心好啊。不知道楼主是从哪里看到的。
//首先这道题楼主要明白以下两点:
//1:继承时,子类会隐藏父类相同的方法,要调用父类方法就必须使用super关键字。
//2:向上转型时,子类会丢失和父类不同的方法,可以使用父类的不同名的所有方法。
public class PolyDemo09
public static void main(String[] args)
A a1 = new A();
A a2 = new B();//B类型向上转型丢失与A类不同方法
B b = new B(); 
C c = new C();
D d = new D();

System.out.println("⑴    " + a1.show(b));//B类的父类是A,所以A and A
System.out.println("⑵    " + a1.show(c)); //C类父类的父类是A,D和他是同级。所以A and A
System.out.println("⑶    " + a1.show(d));//D类方法有,所以不会向上转型,所以A and D
System.out.println("⑷    " + a2.show(b)); /*注意这时候a2的两个方法其实是
public String show(D obj) 
return ("A and D");

public String show(A obj) 
return ("B and A");
  B的父类是A,所以B and A 
*/
 /**/                                                           
System.out.println("⑸    " + a2.show(c));//C的父类的父类是A,所以B and A;
System.out.println("⑹    " + a2.show(d));  //D有对应方法,所以A and D
System.out.println("⑺    " + b.show(b)); /*这个就是继承了,继承除了隐藏父类中和子类同名的方法外,在子类中可以直接使用父类的方法。所以B and B
所以就变成了
public String show(D obj) 
return ("A and D");

public String show(B obj) 
return ("B and B");

public String show(A obj) 
return ("B and A");
*/
System.out.println("⑻    " + b.show(c)); //C 的父类是B,所以B and B
System.out.println("⑼    " + b.show(d));//D有相应方法,所以A and D




class A 
public String show(D obj) 
return ("A and D");

public String show(A obj) 
return ("A and A");



class B extends A 
public String show(B obj) 
return ("B and B");

public String show(A obj) 
return ("B and A");




class C extends B 


class D extends B 

参考技术A a1.show(b));Class A 中没有show(B obj),B转向B的父类A,执行A show(A obj)--->return "A and A"

a1.show(c));Class A 中没有show(C obj),C转向C的父类B,Class A 中没有show(B obj),再转向父类A,执行A show(A obj)--->return "A and A"

a1.show(d));Class A 中有show(D obj)执行A show(D obj)--->return "A and D"

这个比较特殊:A a2 = new B();父类声明,子类实例,你应该把a2当作子类重写完后的父类看,注意只有父类的方法。

a2.show(b));Class A 中没有show(B obj),B转向B的父类A,执行A show(A obj),A的show 方法被重写,执行B show(A obj)--->return "B and A"

a2.show(c));Class A 中没有show(C obj),C转向C的父类B,Class A 中没有show(B obj),B转向父类A,执行A show(A obj),A的show 方法被重写,执行B show(A obj)--->return "B and A"

a2.show(d));Class A 中有show(D obj)执行A show(D obj)--->return "A and D"
b.show(b)); Class B 中有show(B obj)--->return "B and B"

b.show(c)); Class B 中没有show(C obj),C转向C的父类B,执行B show(B obj)--->return "B and B"

b.show(d)); Class B 中有继承了Class A 的show(D obj),执行A show(D obj)--->return "A and D"本回答被提问者采纳
参考技术B 考察的是java的多态知识,主要是父类引用指向子类对象,比如⑴ A and A,a1.show(b),看a1是A的实例然后在A类的方法里找没有show(B obj),然后找有没有show(X obj),X是B的父类(找到了);其实如果没找到在A类的子类里找与没有show(B obj),然后找有没有show(X obj),X是B的父类;就这样找 参考技术C a1.show(b)而言,a1是A类,由b类型可知,要调用的方法从A中找,即show(A obj);所以会输出第一行结果;
其余皆可这么分析追问

找你这么说那第五个和第六个怎么分析

追答

来晚了 上面有更好的回答 就不废话了

参考技术D

我画了个图也有两个没明白(4)(5)

追问

能不能再加点文字说明,还是有点看不明白

java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType这个异常怎么解决 谁能帮我一下

import 。。。
public class addminBlogHibernatebak<T,PK extends Serializable> implements AdminBlogDao<T, PK>

private Class<T> clazz;
public addminBlogHibernatebak()
clazz=(Class<T>)((ParameterizedType)getClass ().g etGenericSuperclas()).getActualTypeArguments()[0];

public void delete(T entity)
Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.delete(entity);



public void update(T entity)
Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.update(entity);



问题出在构造方法上 每次运行程序时就出现上面的异常.谢谢大家啊 都是热心人
我感觉是泛型我使用的方法不对 希望大家能在这方面帮小弟一下

构造方法写得没错,是泛型用错了,有两种解决方案。

1、再写一个子类继承这个类,子类可以没有任何属性和方法,但必须指明泛型类型,然后使用子类创建对象。

2、写一个含有Class<T>类型的构造方法,在使用该类创建对象时给出具体类型。

软件包 java.lang.reflect 的描述。

提供类和接口,以获取关于类和对象的反射信息。在安全限制内,反射允许编程访问关于加载类的字段、方法和构造方法的信息,并允许使用反射字段、方法和构造方法对对象上的基本对等项进行操作。

如果必需的ReflectPermission可用,则AccessibleObject允许抑制访问检查。

参考技术A 构造方法写的没错,是泛型用错了,有两种解决方案,1.再写一个子类继承这个类,子类可以没有任何属性和方法,但必须指明泛型类型,然后使用子类创建对象 2.写一个含有Class<T>类型的构造方法,在使用该类创建对象时给出具体类型 参考技术B 有Class A 跟 Class B
A跟B没有任何关系
你把A塞给B就抛这个异常了
参考技术C 转换异常了。。。上面说的都有道理!!! 参考技术D 就是说你拿到的是String变量,你把它强制转换成Date型的所以出错
你可以用Format类或者自己分析carno的格式转换成Date类型
比方carno="2001/01/01";
就可以String[] s = carno.split("/");
new Date(Integer.parseInt(s[0]), Integer.parseInt(s[1]), Integer.parseInt(s[2]));之类的处理

以上是关于谁能帮我把这个java代码分析一下我被绕晕了的主要内容,如果未能解决你的问题,请参考以下文章

#FF99FF这是粉色字的颜色代码,有谁能帮我把它转成十进制的代码哦?~谢谢~!

谁能帮我把这首诗译成英语:

谁能帮我改装一下,默认的时候把二级菜单隐藏,需要显示的时候点一下一级分类就可

谁能帮我把百度编辑器写入php的一个页面

谁能帮我把这个程序改为verilog语言必有重谢

谁能帮我看一下这些代码的意思