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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我的问题,如题,抽象类中静态方法不可以new对象么,为什么看我下面代码,注释部分去掉就会报错,我不明白为什么,网上搜了貌似没有想要的答案,多半是抽象类不能实例化的之类的,本人新手,望大神解答!
  1. package test;
  2. public abstract class Test1{
  3.        
  4.         class Test2 extends Test1{
  5.        
  6.         public void Method3(){
  7.                 System.out.println("This is a override Method3");
  8.         }

  9. }
  10.         public static void main(String[] args) {
  11.                 //Test2 t2=new Test2();
  12.                 System.out.println("sublime Text!");
  13.                 Method1(str);
  14.                 //t2.Method3();
  15.                 Test3.Mehtod4();               
  16.         }
  17.         public abstract void Method3();
  18.         public static void Method2(){
  19.                 System.out.println("This is a Method2");
  20.         }
  21. static class Test3{
  22.         public static void Mehtod4(){
  23.                 System.out.println("This is a Mehtod4");
  24.         }
  25. }
  26. }
复制代码


18 个回复

倒序浏览
试了下,在main方法里,可以new外部类,调用不会报错,new内部类就会报错,哪怕继承的是外部类,
回复 使用道具 举报
问题错了,应该是不能new内部类对象
回复 使用道具 举报
如果test1不是抽象的,你可以new test1().new test2();来创建内部类对象,但现在test1是抽象的,不能创建对象,所以你的test2也只能在test1里面创建对象,而不能跑到其他类中创建
回复 使用道具 举报
放养的饼干 发表于 2016-1-20 18:14
如果test1不是抽象的,你可以new test1().new test2();来创建内部类对象,但现在test1是抽象的,不能创建 ...

我是在Test1的静态方法里面new的Test2啊,但是会报错,我的Test2的在Test1的内部,是抽象类的内部类,不知道为什么,抽象类的内部类不能在抽象类的方法中实例!
回复 使用道具 举报
376699155 发表于 2016-1-21 15:00
我是在Test1的静态方法里面new的Test2啊,但是会报错,我的Test2的在Test1的内部,是抽象类的内部类,不 ...

因为抽象类不能被实例化啊,你要在外部类中建立其他外部类的内部类的对象就得先建立外部类对象,现在外部类是抽象不能建立对象,所以在其他类中不能建立这个内部类的对象
回复 使用道具 举报
376699155 发表于 2016-1-21 15:00
我是在Test1的静态方法里面new的Test2啊,但是会报错,我的Test2的在Test1的内部,是抽象类的内部类,不 ...

你是在主方法里new的Test2,不是在Test1里,
回复 使用道具 举报
放养的饼干 发表于 2016-1-21 23:01
你是在主方法里new的Test2,不是在Test1里,

我的main方法不就在Test1里面么,我貌似没听懂,大概理解点,如果我的Test2 是外部类就可以在main里面实例化,但是如果是内部类就不行,可能是实例对象在抽象类内部的原因,但是你的说法,我没完全懂!
能给出正确代码么
回复 使用道具 举报
你method1 在哪里呢?
回复 使用道具 举报
rushing 发表于 2016-1-22 10:18
你method1 在哪里呢?

哦,之前写的,不重要就删了,在Test1里面,只是为了测试,写了个静态的方法。贴出来的时候不小心删了
回复 使用道具 举报
rushing 发表于 2016-1-22 10:18
你method1 在哪里呢?

哦,之前写的,不重要就删了,在Test1里面,只是为了测试,写了个静态的方法。贴出来的时候不小心删了
回复 使用道具 举报
376699155 发表于 2016-1-22 10:06
我的main方法不就在Test1里面么,我貌似没听懂,大概理解点,如果我的Test2 是外部类就可以在main里面实 ...

main是静态的,随着Test1的加载而加载,此时虚拟机还没有加载Test2这个方法,所以你此时创建会报错
被static修饰的方法只能访问同被static修饰的方法或变量
回复 使用道具 举报
放养的饼干 发表于 2016-1-22 22:14
main是静态的,随着Test1的加载而加载,此时虚拟机还没有加载Test2这个方法,所以你此时创建会报错
被sta ...

这么一说我理解了,可能被abstract修饰的类,编译器就不会加载里面的非静态成员
回复 使用道具 举报
放养的饼干 发表于 2016-1-22 22:14
main是静态的,随着Test1的加载而加载,此时虚拟机还没有加载Test2这个方法,所以你此时创建会报错
被sta ...

这么一说我理解了,可能被abstract修饰的类,编译器就不会加载里面的非静态成员
回复 使用道具 举报
那用什么方法可以使用Test2中Method3方法呢???
回复 使用道具 举报
StringBOX 发表于 2016-1-23 11:37
那用什么方法可以使用Test2中Method3方法呢???

嗯,问得好,试了下,可以这样访问
  1.                 //-------Demo3继承抽象Test1
  2.                 Test1 test1=new Demo3();
  3.                  (test1. new Test2()).Method3();
复制代码
回复 使用道具 举报
376699155 发表于 2016-1-23 14:50
嗯,问得好,试了下,可以这样访问

不改原程序,就没法访问了???
什么都不动。。。
回复 使用道具 举报
StringBOX 发表于 2016-1-24 17:09
不改原程序,就没法访问了???
什么都不动。。。

不想写一个继承类的话也可以,不过要写一个匿名内部类,然后在用对象new Test2 在访问Method3
我还是给你看代码吧
  1.          Test1 test11=new Test1() {
  2.                         @Override
  3.                         public void Method3() {
  4.                                 System.out.println("匿名内部类!");
  5.                         }
  6.                  };
  7.                          test11.Method3();
  8.                         (test11.new Test2()).Method3();
复制代码
回复 使用道具 举报
StringBOX 发表于 2016-1-24 17:09
不改原程序,就没法访问了???
什么都不动。。。

如果看变量名也不爽的话,就这样写,至于有没有更好的办法,我就不知道了,我是个新手
  1.         //-------Demo3继承抽象Test1
  2.                 Test1 test1=new Demo3();
  3.                  (test1. new Test2()).Method3();
  4.                  //-------------------------------------
  5.                 new Test1() {
  6.                         @Override
  7.                         public void Method3() {
  8.                                 System.out.println("匿名内部类!");
  9.                         }
  10.                  }.new Test2().Method3();
复制代码

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马