要从内部类B访问外部类A的字段x,我意识到您可以使用"A.this.x".但是,如果外层阶级也是匿名的呢?例如,
public class Main1 {
public static void main(String[] args) {
Comparable c1 = new Comparable(){
int x = 3;
public int compareTo(Object o) {
Comparable c2 = new Comparable(){
int x = 4;
public int compareTo(Object o) {
return x; // <-- THIS LINE
}
};
return c2.compareTo(o);
}
};
System.out.println(c1.compareTo(null));
}
}
Run Code Online (Sandbox Code Playgroud)
运行此代码时,将打印值4,因为这是c2的字段x的值.但是,我想更改标记为"THIS LINE"的行,以便返回外部类的x(即c1的字段x,值为3).如果外部类(即c1的类)是一个命名的类A,那么我可以替换
return x;
Run Code Online (Sandbox Code Playgroud)
同
return A.this.x;
Run Code Online (Sandbox Code Playgroud)
但由于外层也是匿名的,我没有名字可以使用.
问题:有没有办法修改标记为"THIS LINE"的行,使其引用c1的字段x而不是c2,而不将匿名类更改为命名类?
我意识到这段代码非常难看,以这种方式使用匿名类是不好的编程风格,但代码是由另一个程序生成的,这是实现生成器的最简单方法.
考虑这种情况:
public class SomeClass {
public void someMethod() {
new SomeInterface() {
public void someOtherMethod() {
new SomeOtherInterface() {
new someThirdMethod() {
//My question is about code located here.
}
};
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
是否有语法引用注释代码中SomeInterface表示的匿名内部类的实例?对于SomeClass,你可以做到SomeClass.this
是否有相应的获得SomeInterface的实现?
如果没有,当然你可以在SomeInterface实现中定义一个最终的局部变量并引用它,但我只是想知道是否实际上有直接语言支持来引用该实例.
我有这些代码行.我知道你不能将非final变量传递给内部类,但我需要将变量传递i
给匿名内部类以用作seatID.你能建议这样做的方法吗?
JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
for (int i = 0; i < 40; i++)
{
seats[i] = new JButton();//creating the buttons
seats[i].setPreferredSize(new Dimension(50,25));//button width
panel4seating.add(seats[i]);//adding the buttons to the panels
seats[i].addActionListener(new ActionListener()
{ //anonymous inner class
public void actionPerformed(ActionEvent evt)
{
String firstName = (String)JOptionPane.showInputDialog("Enter First Name");
String lastName = (String)JOptionPane.showInputDialog("Enter Last Name");
sw101.AddPassenger(firstName, lastName, seatingID);
}
});
}
Run Code Online (Sandbox Code Playgroud) 我最近问了一个关于检查发送短信状态的问题,给出的答案是一个代码片段,注册了两个"匿名内部"(如果不正确,请更正我的术语)BroadcastReceivers
来收听短信发送/传送的广播.这些接收器只需要接收有关我的应用程序刚刚发送的SMS的数据,因此不需要永久收听.
我的直接想法是"好吧,我完成后我需要取消注册",但这是正确的吗?我问海报,因为他没有包含任何未注册的代码,但没有得到回复.代码似乎是一种非常标准的方式来做我想要的,因为它出现在许多Android开发网站上.这里是:
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service", …
Run Code Online (Sandbox Code Playgroud) 在Java中,我有以下代码
List<Integer> myList = new ArrayList<>();
for (int i=0;i<9;i++) {
myList.add(i);
}
Integer sum = 0;
myList.forEach(i -> {
sum = sum + i; // does not compile, sum needs to be final or effectively final
});
for(int i : myList) {
sum = sum + i; //runs without problems
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我不能在lambda中改变sum的值?它与下面的for循环完全相同,或者我错了?有趣的是,如果我将main方法之外的整数和声明为静态,它也可以.谁能解释我为什么?
编辑:在另一个类似的问题Java 8支持闭包,答案似乎是:
它是向后兼容性和项目资源约束的组合.
但是,我仍然无法理解为什么它可以工作,如果我将数组和数组或我在main之外声明它.我还想了解下面的myList.forEach和for循环之间有什么区别,为什么一个有效,另一个没有.
Afaik,在Java中,匿名内部类总是拥有对其外部类的封闭实例的引用.现在当我在静态方法中放入一个匿名类时会发生什么?由于它的外部类没有对象,它是否包含对调用静态方法的类的引用?我在这里有点困惑.考虑下面的Android示例(使用parse.com框架):
public class OnlineQuery {
public static void queryUsers(final ListenerInterface listener) {
ParseQuery<ParseUser> query = User.getQuery();
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(final List<ParseUser> userList, ParseException e) {
listener.reportBackToCallingActivity();
// to which class is as a reference held here?
}
});
}
}
public class MainActivity extends Activity implements OnlineQuery.ListenerInterface {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OnlineQuery.queryUsers(this)
}
...
}
Run Code Online (Sandbox Code Playgroud)
另外,正在使用一个监听器,如示例中关于内存泄漏的错误做法所示?谢谢!
java android static-methods memory-leaks anonymous-inner-class
我正在为学校制作一个成绩单项目,它正在编译好像有一个匿名的内部课程,但我没有写过任何内容.为什么javac在没有编写任何内部类(包括枚举或异常)的情况下编译内部类?有问题的文件是SemesterInfo $ 1.class,由SemesterInfo.java编译.我见过类似的问题,其中实际上有内部类,但这里没有.我从Java库中抛出一个异常(UnsupportedOperationException),但它已经在库中定义(java.lang.UnsupportedOperationException),因此不是匿名的或内部类.我的目录如下:
02/20/2016 02:03 PM 915 AddResult.class
02/15/2016 09:16 PM 848 AddResult.java
02/20/2016 02:03 PM 1,032 Console.class
02/05/2016 08:27 AM 1,315 Console.java
02/20/2016 02:03 PM 1,624 CourseInfo.class
02/19/2016 10:56 AM 9,203 CourseInfo.java
02/20/2016 02:03 PM 2,244 CourseInfoTester.class
02/17/2016 05:15 PM 2,226 CourseInfoTester.java
01/22/2016 10:55 AM 3,769 Keyboard.class
02/20/2016 02:03 PM 686 SemesterInfo$1.class
02/20/2016 02:03 PM 6,810 SemesterInfo.class
02/20/2016 01:57 PM 36,263 SemesterInfo.java
02/20/2016 02:03 PM 1,350 SemesterInfoTester.class
02/17/2016 11:59 PM 1,050 SemesterInfoTester.java
Run Code Online (Sandbox Code Playgroud)
import java.util.Scanner;
public class …
Run Code Online (Sandbox Code Playgroud) 我正在定义一个回调,并希望从内部引用回调.编译器不喜欢这样,并声称引用回调的变量未初始化.这是代码:
final Runnable callback = new Runnable() {
public void run() {
if (someCondition()) {
doStuffWith(callback); // <<--- compiler says "the local variable callback may not be initialized"
}
}
};
// Here callback is defined, and is certainly defined later after I actually do something with callback!
Run Code Online (Sandbox Code Playgroud)
很明显,编译器被误认为是在我们到达内部方法的时候定义了回调.如何告诉编译器这段代码没问题,或者我怎么能用不同的方式编写它来安抚编译器呢?我没有做太多Java,所以我可能会在这里咆哮错误的树.有没有其他惯用的方法来做到这一点?对我来说,这似乎是一个非常简单的构造.
编辑:当然,这个,太容易了.感谢所有快速解答!
假设我有以下两个类/接口定义:
public abstract class FooClass {
public abstract void doFoo();
}
Run Code Online (Sandbox Code Playgroud)
和
public interface BarInterface {
public void doBar();
}
Run Code Online (Sandbox Code Playgroud)
如果我想创建一个扩展/实现两者的匿名内部类,我是否需要这样做:
public abstract class BothClass extends FooClass implements BarInterface {}
...
new BothClass() {
public void doFoo() {
System.out.println("Fooooooooo!!!!");
}
public void doBar() {
System.out.println("Baaaaaaaar!!!!");
}
}.doBar();
Run Code Online (Sandbox Code Playgroud)
或者是否有一个允许我不定义的捷径BothClass
?这样的事情,也许:
new (FooClass implements BarInterface)() {
public void doFoo() {
System.out.println("Fooooooooo!!!!");
}
public void doBar() {
System.out.println("Baaaaaaaar!!!!");
}
}.doBar();
Run Code Online (Sandbox Code Playgroud)
(这个想法给了我几个错误,这些都没有帮助)
java anonymous-inner-class subclassing interface-implementation
我搜索了这个,但遗憾的是找不到匹配,我在这样local anonymous inner class
的方法中有这个: -
new Object(){
public void open(){
// do some stuff
}
public void dis(){
// do some stuff
}
};
Run Code Online (Sandbox Code Playgroud)
在2 methods
里面(open,dis)
,我知道,如果我想使用他们中的任何一个,那就做
new Object(){
public void open(){
// do some stuff
}
public void dis(){
// do some stuff
}
}.open()
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如果我想同时调用这两种方法怎么办?我该怎么做?