java:疑问出现在注释对应的代码:1.类对象为啥final修饰?2.匿名内部类不大了解,接口不能用new对象吧?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SwiFrame {
public static void main(String[] args) {
final JFrame jframe1 = new JFrame("我的框架");//内部类要调用的对象需final修饰
jframe1.setSize(300, 200);
JButton jbt1 = new JButton("改变框架标题");
jframe1.getContentPane().add(jbt1);
jbt1.addActionListener(new ActionListener(){//使用了匿名内部类实现接口??=监听器对象??接口名是对象名吗?匿名内部类要求是 new 对象名(){};

@Override
public void actionPerformed(ActionEvent e) {
jframe1.setTitle("框架新标题");
}

});
jframe1.setVisible(true);

}

}

 1:为啥匿名内部类访问外部类局部变量要是final的。 
 简单来说就是为了防止你这个内部类所调用的局部变量因为非此内部类操作改变了值。
 你想想外部类的一个局部变量不定义final。内部类在用它,内部类没有方法对这个变量操作 ,而外部类或者其他内部类操作了它改变了数值,那么对内部类A来说不是很郁闷吗。。。内部  类A根本没有操作它却改变了数值。

2:接口本身是不能使用New 的.. 而是子类的对象,指向父类的引用是能使用new的..
比如说:
接口 intefaces=new 子类对象();   --->正确;(你的代码却是这种)..
接口 intefaces=new 接口();          --->这样肯定是错误的.. 
 new ActionListener() 是创建一个继承自ActionListener的匿名类对象,通过new表达式返回的引用自动向上转型为对ActionListener的引用。
因为匿名类本身无名,也就不存在构造方法,需要显式调用父类的构造方法,并重写父类的方法.。

追问

你的意思是不是说程序匿名内部类中ActionListener默认为子类对象,不需要附加语句实现说明对吧?但ActionListener是一个接口,好像没有继承这么一说???

追答 由于ActionListener 是接口,所以new ActionListenr{ 重写接口中未实现的方法} 中 的继承其实是实现。
如果你用的监听是适配器类,也就是实现了上层接口的抽象类,如下:
   buttom.addMouseListener(new MouseAdapter() {
         //只需要重写你想要重写的
    });
由于这时候MouseAdapter为抽象类,所以就是继承。
不管哪种情况:记住 接口和抽象类都不能new来构造他的实例,那么如何创建他们的实例了,
          Java 为我们提供的向上转型,就是用父类对象指向子类,通过子类实例创建父类           实例。而匿名内部类就是其中一种常用的方法。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-30

    类对象为啥final修饰主要是使得类不能再继承。主要是为了“效率” 和 “安全性” 的缘故。


    匿名内部类也就是没有名字的内部类

    正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

    但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

    接口不能直接new对象,只能实现借口。


第2个回答  2013-08-30
一 .为什么要用final... 因为就是这么设计的 你不这么写 程序就不能编译 所以你必须这么写
二 new 接口 就是匿名内部类最常见的用法 (不只是接口 抽象类 普通类一样可以这么new出来) 谁告诉你 匿名内部类要求必须是 new 对象名的?你可以去抽他 new 接口完全没问题追问

那个内部类的基本语法我是在教学视频上看的,上面说匿名内部类的基本语法为:
return new A(){//A为对象名
//内部类体

};

追答

就是啊
return new A(){//A为对象名或者 接口名
//内部类体

};
其实写成这样就对了.....

第3个回答  2013-08-30

明显的嘛,内部类不一定非得要使用final修饰。使用final修饰的Class无法被继承,意味着该类不需要拓展或者修改。

接口可以New,但不是New接口本身。而是New接口的实现类。for example:

List<Integer> list=new ArrayList<Integer>();
List就是一个接口,可以New它的实现类ArrayList。

相似回答
大家正在搜