黑马程序员技术交流社区

标题: 关于类的继承,super方法调用 [打印本页]

作者: 张华廷    时间: 2012-6-22 00:12
标题: 关于类的继承,super方法调用
本帖最后由 张华廷 于 2012-6-22 17:23 编辑

public class Demo2 {

        /**
         * @param args
         */
         public void print() {
         System.out.println(super.getClass());
         System.out.println(this.getClass());
         }
        
class  Demo1 extends Demo2 {
         public void print() {
             System.out.println(super.getClass());
             System.out.println(this.getClass());
             }
        }
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                 Demo1 t1=new Demo1();//为什么提示错误
                Demo2 t2=new Demo2();
                t1.print();
                 t2.print();
               
        }

}


作者: 耿鑫    时间: 2012-6-22 00:42
老妹儿, 你先把你的代码整理好再发上来被,还有说明你要问的问题啊
作者: 吴小东    时间: 2012-6-22 00:45
本帖最后由 吴小东 于 2012-6-22 00:54 编辑

哥们你这里不知道是你笔误呢还是就是这个问题,Demo2 t=new Demo2();

你新建了一个Demo2  也就是父类的对象 然后是两个输出语句
   System.out.println(super.getClass());  //这里你可以看着是调用了Object 中的getClass()的这个方法,返回此时Object的运行时类,也就是Demo2 类
     System.out.println(this.getClass());   //这里this 指向本类的对象,其实也是和Super的效果一样的,始终是调用Object中的getClass()方法 返回当前运行的类 那么也是Demo2 类
所以两个都会打印Demo2

作者: 吴小东    时间: 2012-6-22 00:46
{:soso_e127:} 妹儿?
作者: 燃烧端午    时间: 2012-6-22 00:53
super.getClass()并不会返回超类的引用,super并没有代表超类的一个引用的能力
要想得到父类类名用可以这样getClass().getSuperClass().getName();  


作者: 黑马_张佳超    时间: 2012-6-22 10:58
错误提示因为Demo1为内部类。无法在外部类的静态方法内完成对象初始化操作。
作者: 王莹    时间: 2012-6-22 11:43
本帖最后由 王莹 于 2012-6-22 11:44 编辑
  1. public  class Demo2 {

  2.         /**
  3.           * @param args
  4.           */
  5.           public void print() {
  6.           System.out.println(super.getClass());
  7.           System.out.println(this.getClass());
  8.           System.out.println("Father!");
  9.           }
  10.          
  11. static class  Demo1 extends Demo2 {
  12.           public void print() {
  13.               System.out.println(super.getClass());
  14.               System.out.println(this.getClass());
  15.                System.out.println("Son!");
  16.              }
  17. }
  18.          public static void main(String[] args) {
  19.                  // TODO Auto-generated method stub
  20.                   Demo1 t1=new Demo1();//为什么提示错误
  21.                  Demo2 t2=new Demo2();
  22.                  t1.print();
  23.                   t2.print();
  24.                  
  25.         }
  26. }
复制代码
因为你在Demo1中的静态main 方法中创建了Demo1类的对象,而Demo1是Demo2的内部类,外部类的静态方法访问内部类,内部类必须为静态的。此时你需要在Demo1前面加上修饰符static,就可以运行出来答案了。为了区分你的子类Demo1和父类Demo2的print方法的结果,又多添了两条语句来区分是哪个类调用的结果,运行结果如下:



作者: 张华廷    时间: 2012-6-22 17:22
王莹 发表于 2012-6-22 11:43
因为你在Demo1中的静态main 方法中创建了Demo1类的对象,而Demo1是Demo2的内部类,外部类的静态方法访问内 ...

嗯,知道了,谢了
作者: 周朋飞    时间: 2012-6-26 17:22
我想你也查了资料了,我就把我的理解给你说一下:首先java语法中规定,静态方法不能访问非静态的成员,或者方法,你犯的错误是 你在外部类的静态方法中去调用了 内部类的构造方法,但是这个内部类作为外部类的成员,你并没有将其设为静态的,所以不能访问是正常的 ,只要你将其内部类设为静态,就符合语法了  就像上面演示的效果一样

希望能帮到你




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2