A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张华廷 中级黑马   /  2012-6-22 00:12  /  2356 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张华廷 于 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();
               
        }

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 老妹~~呵呵

查看全部评分

8 个回复

倒序浏览
老妹儿, 你先把你的代码整理好再发上来被,还有说明你要问的问题啊
回复 使用道具 举报
本帖最后由 吴小东 于 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
回复 使用道具 举报
{:soso_e127:} 妹儿?
回复 使用道具 举报
super.getClass()并不会返回超类的引用,super并没有代表超类的一个引用的能力
要想得到父类类名用可以这样getClass().getSuperClass().getName();  

回复 使用道具 举报
错误提示因为Demo1为内部类。无法在外部类的静态方法内完成对象初始化操作。
回复 使用道具 举报
王莹 中级黑马 2012-6-22 11:43:08
7#
本帖最后由 王莹 于 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方法的结果,又多添了两条语句来区分是哪个类调用的结果,运行结果如下:


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王莹 发表于 2012-6-22 11:43
因为你在Demo1中的静态main 方法中创建了Demo1类的对象,而Demo1是Demo2的内部类,外部类的静态方法访问内 ...

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

希望能帮到你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马