匿名内部类不能增加新方法吗?

lion7beck 2013-03-05 03:32:39
匿名内部类继承了个普通方法,并在此基础上增加了一个方法。发现尽管内部类没报错,但使用该方法时发生了语法错误。代码为:

//父类
class A{
int j = 30;
protected void printFun(){
System.out.println("This is abcde~~");
}
}

class B{
public A b(){
A a = new A(){
public void printFun(){
System.out.println("This is not abcde~~ ");
}
//新加的方法
public void printFun2(){
System.out.println("Lalalalalala!!!");
}
};
return a;
}
}
class NoNameClassTest{
public static void main(String aa[]){
A aaa;
B b = new B();
aaa = b.b();
aaa.printFun();
aaa.printFun2();//此行报错,为:“The method printFun2() is undefined for the type A”
}
}


希望大家指点下,感谢!
...全文
532 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
idm2008 2013-03-13
  • 打赏
  • 举报
回复
二楼说的很好。
NullPointerEx 2013-03-12
  • 打赏
  • 举报
回复
其实楼主你这段代码,既不是匿名类,也不能叫做内部类,只是在一个方法中new了一个类的对象,同时不同之处在于你在后面又添加了新的方法。 仅此而已。 你的问题可以简化为:

public class A {
	public void printFun() {
		System.out.println("printFun");
	}
}
public static void main(String aa[]) {
		A a = new A() {
			public void print1() {
				System.out.println("1");
			}

			public void print2() {
				System.out.println("2");
			}
		};
		a.print1();//错误
		a.printFun();
	}
这样的写法是不能用来添加新方法的,但是却可以用来覆盖 A类中已有的方法。 如果想使用新添加的方法,可以这么写:

public static void main(String aa[]) {
		new A() {
			public void print1() {
				System.out.println("1");
			}

			public void print2() {
				System.out.println("2");
			}
		}.print1();
	}
具体原理不是特别清楚,应该和权限访问问题和作用域是有关系的。
oh_Maxy 2013-03-08
  • 打赏
  • 举报
回复
引用 3 楼 yanxing2012 的回复:
#2 说的对
+1
失落夏天 2013-03-07
  • 打赏
  • 举报
回复
会用,知道哪里错,但是说不出来。。 顶下二楼
yanxing2012 2013-03-07
  • 打赏
  • 举报
回复
#2 说的对
赏金--猎人 2013-03-07
  • 打赏
  • 举报
回复
二楼解释的很好!
Candylibin 2013-03-06
  • 打赏
  • 举报
回复
LZ 这个之所以出错是因为A a = new A() 涉及到了多态的问题,你的父类根本没有printFun2()这个方法,怎么可能 能用父类指向自己的子类对象的引用变量来调用呢? 其实匿名内部类主要的目的就是为了:1,简化书写 2,覆盖方法(一般超过3个) 所以匿名内部类中,定义子类特有的方法是没有什么意义的
public class InterClassDemo {
	public static void main(String aa[]){
       /* A aaa;
        B b = new B(); 
        aaa = b.b();   
        aaa.printFun();
        aaa.printFun2();*/
		
	new B().b();
    }
}


//父类
abstract class A{
  int j = 30;
  abstract void printFun();
  
}

class B{
  public void b(){
      A a = new A(){
          public void printFun(){
              System.out.println("This is not abcde~~ ");
          }
                      //新加的方法
          public void printFun2(){
              System.out.println("Lalalalalala!!!");
          }
      };
      a.printFun();
      //错误 
      a.printFun2();
  }
}

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧