我已经使这两个类使用了匿名内部类的概念。 1类有一个静态内部类。第2课使用它。但我无法理解如何调用内部类的方法。请帮帮我。
第1类
public class outerclass {
outerclass() {
System.out.println("Constructor of new class");
}
public void showthis(String str) {
System.out.println(str);
}
static class insideclass {
insideclass() {
System.out.println("This is inside class constructor");
}
public void nowshowthis(String str) {
System.out.println(str);
}
}
}
第2类
public class helloworld {
public static void main(String args[]) {
//this is an object of the outer class
outerclass example=new outerclass();
//How do i make an anonymous inner class and call the method "nowshowthis()"
}
}
答案 0 :(得分:3)
让我摆脱我的直接问题!如果非静态中的内部类,这就是如何实现它:(假设example
为是outerclass
)
example.new insideclass().nowshowthis("my String")
对于static public
内部类,你不甚至需要一个外部类的实例。就这样做(很像访问公共静态变量)
new outerclass.insideclass().nowshowthis("my String")
你试过这个吗?
这是什么交易?在你的情况下,你并没有真正处理匿名内部类。它实际上只是一个普通的香草内心阶级。 (我无法理解你为什么这样做。)
那么什么是匿名类,我们在哪里使用它?匿名类就像一次使用类的实例。当你实现一些接口时,其中一个例子浮出水面......但是你不需要另外使用它。例如,您想要将处理程序附加到按钮。你可以这样做(假设的例子)
MyButtonInterface obj= new MyButtonInterface(){
@Override
onClick(Model obj){
//save model in DB
}
}
UI.add(obj, "specificId");
你知道吗?
答案 1 :(得分:3)
匿名内部类是在另一个类的方法体内创建和定义的内部类。实质上,您正在从抽象定义中动态创建一个具体类。到目前为止,你的InnerClass类实际上只是一个常规的内部类,意思是非匿名的。
如果您想尝试使用匿名内部类,我能想到的最简单的方法是将您的InnerClass更改为接口,如下所示:
public interface InnerClass{
public void doSomething();
}
所以目前,InnerClass确实蹲下;在定义之前它没有任何意义。接下来,您将要更改OuterClass的工作方式。像这样改变你的showThis()函数:
public showThis(InnerClass innerObj){
innerObj.doSomething();
}
现在我们让你的外部类要求内部类实例做一些事情,但是我们仍然没有定义我们希望它做什么。这就是魔术发生的地方 - 在你的main方法中,你将定义内部类实例的实际内容:
public static void main (String[] args){
OuterClass outer = new OuterClass();
// This is the key part: Here you are creating a new instance of inner class
// AND defining its body. If you are using Eclipse, and only write the
// new InnerClass() part, you'll notice that the IDE complains that you need
// to implement the doSomething() method, which you will do as though you
// were creating a plain 'ol class definition
outer.showThis(new InnerClass(){
public void doSomething(){
System.out.println("This is the inner anonymous class speaking!");
}
});
}
在实践中,我没有过多地使用匿名内部类,但是它们对于了解它们很有用。我在进行GUI编程时经常使用它们来定义GUI控件事件的监听器,例如按钮点击。
另外,正如其他人提到的那样,请记住Java标准的类名的第一个字母是大写字母,我在这里做过。您需要遵循该标准,因为它使其他人更容易阅读您的代码,并且您可以很容易地告诉您何时查看课程以及何时查看对象。
无论如何,希望有所帮助。
答案 2 :(得分:1)
insideclass
是一个非静态类,因此必须通过外部类的实例访问它,如下所示:
new outerclass().new insideclass().nowshowthis();
答案 3 :(得分:1)
这不是一个匿名的内部类。以下是匿名内部类的示例:
class InnerClassDemo {
public static void main(String[] args) {
ActionListener a = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
};
// now a is the only instance of an anonymous inner class implementing the ActionListener interface
}
}
您当然也可以使用自己的界面或类来执行此操作:
class InnerClassDemo {
public class InsideClass {
InsideClass() {
System.out.println("This is inside class constructor");
}
public void nowshowthis(String str) {
System.out.println(str);
}
}
public static void main(String[] args) {
InsideClass anonym = new InsideClass() {
@Override
public void nowshowthis(String str) {
System.out.println("anonymous inner class override: "+str);
}
}
InsideClass normalInstance = new InsideClass();
anonym.noshowthis("test");
normalInstance.noshowthis("test");
}
}
您的输出将是
anonymous inner class override: test
test
因此anonym
是InsideClass
的匿名内部类实现的实例,而normalInstance
只是您的类InsideClass
的正常实例。
答案 4 :(得分:1)
public class HelloWorld {
public static void main(String args[])
{
outerclass.insideclass example= new outerclass.insideclass();
example.nowshowthis("Hello");
}
}
或者,让nowshowthis方法保持静态,可以这样调用:
outerclass.insideclass.nowshowthis("Howdy. This method is static.");