「java内部匿名」匿名内部类java
今天给各位分享java内部匿名的知识,其中也会对匿名内部类java进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java匿名内部类具体概念是什么,在什么地方用到?
java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
示例如下:
public class Outer {
private static int i = 1;
private int j = 10;
public static void outer_f1(){
}
public void outer_f2(){
}
// 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
static class Inner{
static int inner_i = 100;
int inner_j = 200;
static void inner_f1(){
System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
}
void inner_f2(){
// System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员
// outer_f2();//包括非静态变量和非静态方法
}
}
public void outer_f3(){
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
}
public static void main(String[] args) {
new Outer().outer_f3();
}
}
Java匿名内部类怎样创建,有何作用和优点,创建线程怎样使用匿名内部类
1、匿名内部类就是没有名字的内部类。这是Java为了方便我们编写程序而设计的一个机制。因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。
2、如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
3、用匿名内部类创建多线程有两种方式,和创建一个线程是一样的。
第①种继承Thread:
new
Thread(){
public
void
run(){
//do
something
};
}.start();
第②种实现
Runnable接口:
new
Thread(new
Runnable()
{
public
void
run()
{
//do
something
};
})
{
}.start();
java匿名内部类
Inner classes(内隐类)
inner class得以让你控制“某个class在另一个class中的可视性”。
位于methods和scopes之内的inner classes(内隐类)
你可以将inner classes置于函数之内或甚至置于任意程序范畴(scope)之内。
以下应用:
1. 定义与函数之内的class。
2. 定义于函数内某一段范畴(scope)内的class。
3. 一个匿名(anonymous)class,实现某个interface。
4. 一个匿名class,扩充某个“拥有non-default构造函数”之class。
5. 一个匿名class,执行数据成员初始化动作。
6. 一个匿名class,以实体(instance)初始化来执行构造动作。注意,匿名的inner classes不得拥有构造函数。
匿名(anonymous)inner class
当base class需要一个带有引数的构造函数时,只要将适当引数传入base class构造函数种。
如果你定义了某个匿名inner class,并且希望用到定义于匿名inner class之外的某个对象,编译器会限制该外部对象必须为final。
同时通过实体初始化(instance initialization)你可以实际完成一个匿名inner class的建构。
与外围(outer)class的连接关系
inner class天生具有对enclosing class之所有成员的访问权力。
static inner class(静态内隐类)
如果你不需要inner class对象和enclosing class对象之间的连接关系,你可以将inner class声明为static。如果你想了解这么声明的确切时机,记住,一般的inner class(也就是non-static inner class)会自动记录一个reference指向enclosing class的某个实例,而后者也就是此inner class对象的制造者。但是一旦你将inner class声明为static,上述说法就不成立。static inner class意味着:
1. 产生对象时,并不需要同时存在一个enclosing class实例。
2. 你无法在static inner class对象中访问enclosing实例成员。
一般而言,你不能将任何程序代码置于interface内,但static inner class却可以使interface的一部分。这是因为class既然被声明为static,也就不会破坏interface的规则—static inner class只不过是被置于interface的命名空间中罢了。
取用(referring)outer class的实例
在你需要产生一个reference指向outer class对象时,命名方式便是在outer class名称之后紧接一个句号,然后再接this。
如果你想直接产生inner class对象,你不能像你所想象地在new表达式中使用outer class的名称,你必须使用outer class的实例来产生inner class对象。如:
Parcell1 p = new Parcell1();
Parcell1.Contents c = p.new Contents();
因此,除非你已经拥有一个outer class对象,否则便无法产生其inner class对象。这是因为inner class对象会被暗中连接到某个outer class对象上,后者即该inner class对象的制造者。不过,如果你制作的是static inner class,那就不需要一个reference指向outer class对象了。
从多层嵌套class向外伸展触角
无论inner class被嵌套置放的层次有多深,其所有outer classes的成员都可以被它访问。
继承inner classes
由于inner class的构造函数必须连接到一个reference指向outer class对象身上,所以当你继承inner class时,事情便稍微复杂些。问题出在“指向outer class对象”的那个神秘的reference必须被初始化,但derived class之内不存有可连接的缺省对象。这个问题的答案是,使用专用语法,明确产生关联性:
class WithInner{
class Inner{}
}
public class IneritInner extends WithInner.Inner{
//!InheritInner(){} //Won’t compile
InheritInner (WithInner wi)
{
wi.super();
}
}
InheritInner继承的是inner class而非outer class。但是当编译至构造函数时,default构造函数有问题;而且你也不能够只是传入一个reference指向outer object,你还必须在构造函数中使用以下语法:
enclosingClassReference.super();
inner classes可被覆写么吗?
我们能否把inner class视为outer class的一个函数一样,覆写inner class呢?
不能的。
Inner classes的标识符
先是outer class名称,其后紧接“$”符号,然后再紧接inner class名称。如果inner class没有名称,编译器会自动产生数字,做为inner class的标识符。如果inner classes被嵌套置于其他inner classes之内,其名称就会直接附加于“$”符号与outer class标识符(可能多个)之后。
为什么需要inner classes?
关于inner classes的存在,最让人信服的理由是:
每个inner class都能够各自继承某一实现类(implementation)。因此,inner class不受限于outer class是否已继承自某一实现类。
如果少了inner class所提供的“继承自多个具象(concrete)或抽象(abstract)类”的能力,设计上和编程上的某些问题会变得十分棘手。所以,从某个角度来看inner class,你可以说它是多重继承问题的完整解决方案。interface能够解决其中一部分问题,但inner classes才能有效而实际地允许“多重实现继承(multiple implementation)”。也就是说,inner classes实际上允许你继承多个non-interface。
通过inner classes,你可以拥有下列几个额外性质:
1. inner class可以拥有多份实体(instances),每个实体都拥有专属的状态信息(state information),而这些信息和outer class对象的信息是相互独立的。
2. 在单一outer class内你可以拥有多个innner classes,每个都实现相同的interface,或以不同方式继承同一个class。
3. 产生inner class对象的时间点,不见得必须和产生outer class对象同时。
4. outer class和inner class之间不存在is-a的关系,inner class是独立个体。
Closures(终结)和Callbacks(回调)
所谓closure是一种可被调用的对象,它会记录一些信息,这些信息来自它的产生地所在的程序范畴(scope)。
让inner class提供closure功能,是完美的解决方案。比起指针来说,不仅更具有弹性,而且安全许多。
callback的价值在于其弹性—你可以在执行时期动态决定究竟要调用哪个函数。
Inner classes和control frameworks
所谓application framework,是一组“被设计用来解决特定某种问题”的classes。如果你想套用某个application framework,你得继承一个或多个classes,并覆写其中某些函数。通过被覆写的函数内的新版程序代码,便可将application framework所提供的通用解法特殊化,针对性地解决你的特定问题。
所谓control framework,其实就是一种特殊形式的application framework,用来解决“事件(events)回应”的需要。一个系统如果主要工作在于回应诸般事件,我们称为“事件驱动系统(event-driven-system)”。
Java Swing程序库便是一个control framework,优雅解决了GUI问题,并大量采用inner classes。
关于java内部匿名和匿名内部类java的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2023-01-08,除非注明,否则均为
原创文章,转载请注明出处。