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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨文宇 中级黑马   /  2012-8-6 08:44  /  1782 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨文宇 于 2012-8-6 12:40 编辑

  1. public class Test{
  2. public Test(){
  3.   System.out.println(this.getClass());
  4. }
  5. public static void main(String[] args){
  6. new Test1(){};
  7. new Test2();
  8. }
  9. }
  10. class Test1 extends Test{
  11. public Test1(){
  12.   System.out.println(this.getClass());
  13. }
  14. }
  15. class Test2 extends Test1{
  16. public Test2(){
  17.   System.out.println(this.getClass());
  18. }
  19. }
复制代码
输出答案是:
class javaEnhance.Test$1  
class javaEnhance.Test$1
class javaEnhance.Test2
class javaEnhance.Test2
class javaEnhance.Test2
1.Test$1, 是什么意思? new Test1(){}不是创建Test1的匿名子类吗?
2.怎么 new Test2()输出的都是class javaEnhance.Test2,什么原因?和继承有什么关系?最好说得详细点

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

9 个回复

倒序浏览
代码应该贴错了,主方法都不在类中
javaEnhance.Test$1这个应该就是内部类的意思
回复 使用道具 举报
本帖最后由 官文昌 于 2012-8-6 15:16 编辑

public class Test
{
    public class Test   {
        public Test()
        {
                System.out.println("---Test---"+this.getClass());
        }
        public static void main(String[] args)        
        {
                new Test1(){};//Test$1 就是内部类的意思,当程序运行这句话时,Test1继承了Test,所以Test1继承了父类的Test()方法,而this代表本类(内部类),所以运行的结果
                                          //是
Test$1。当运行完父类的方法后,程序运行子类的特有方法。从结果你就可以看到这句话输出了两个结果。


               System.out.println("----------");//加了这句话你就更好理解了~~
                new Test2();//注意,当子类继承父类时,子类也继承了
        }
}   //注意:只有类与类才可以继承,此处少个}。
        class Test1 extends Test
        {
                public Test1()
                {
                        System.out.println("---Test1---"+this.getClass());
                }

        }
        class Test2 extends Test1
        {
                public Test2()
                {
                        System.out.println("---Test2---"+this.getClass());
                }
        }
输出结果:
---Test---class test.Test$1
---Test1---class test.Test$1
---------------------------------------
---Test---class test.Test2
---Test1---class test.Test2
---Test2---class test.Test2


楼主:请养成良好的书写习惯~~你这样的写法,你看不懂也正常~~当你的运行结果不知道运行是那个类时,请在输出语句里面加入编号,这样能更好的便于我们理解~~

回复 使用道具 举报
官文昌 发表于 2012-8-6 09:48
public class Test
{
    public class Test   {

感谢提醒!
回复 使用道具 举报
求解答。
回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-6 14:34 编辑
官文昌 发表于 2012-8-6 09:48
public class Test
{
    public class Test   {


new Test1();//new Test1(){}不是创建Test1的匿名子类吗???匿名子对象有{}这对花括号吗??请看视频时仔细点。

根据你的说法。我纠结了很久。我重新翻了张孝祥老师的高新技术那个模拟枚举视频,
他是这么说的:new Test1(){},是用这个类得子类来创建实例对象,这个子类没有名字,所以称之为匿名类。
所以我觉得我的:创建Test1的匿名子类,这句话我没说错
我还做了测试了
  1. public class Test {

  2.         public static void main(String[] args)

  3.         {
  4.                 new Test1(){
  5.                         @Override
  6. //覆盖抽象方法,如果不是子类,那为什么还要覆盖这个方法呢?
  7.                                 public void method() {
  8.                                 }};        
  9.         }

  10. }
  11. abstract class Test1{

  12.         public Test1(){};
  13.         public abstract void method();
  14.         
  15.         class T{
  16.                
  17.         }
  18. }
复制代码
回复 使用道具 举报
官文昌 发表于 2012-8-6 14:35
这个叫匿名内部类吧,我都被搞晕了~~你这都覆写了父类的方法~~(不好意思我上面可能是我想错了,我再查查 ...

  1. public class Test {
  2.   public void method(){
  3.       //不知道这样理解可不可以,下面这个类是Test的匿名内部类,是Test1的匿名子类。
  4.       new Test1(){
  5.          public void doSometing() {
  6.          System.out.println("ssss");
  7.         }
  8.       };
  9.    }
  10. }
  11. abstract class Test1{
  12. public abstract void doSometing();
  13. }
复制代码
回复 使用道具 举报
杨文宇 发表于 2012-8-6 14:57

不好意思,上面是我错了~~请多多指教~~
回复 使用道具 举报
官文昌 发表于 2012-8-6 15:22
不好意思,上面是我错了~~请多多指教~~

这多大事啊,我也很菜,一起进步:handshake
回复 使用道具 举报
杨文宇 发表于 2012-8-6 15:26
这多大事啊,我也很菜,一起进步

最上面的我已近修改了~~
new Test1(){};
System.out.println("");//加了这句话可以更容易理解
new Test2();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马