导航:首页 > 编程语言 > java内部匿名类

java内部匿名类

发布时间:2022-06-28 03:13:43

java匿名内部类具体概念是什么,在什么地方用到

java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。

示例如下:

publicclassOuter{
privatestaticinti=1;
privateintj=10;
publicstaticvoidouter_f1(){

}
publicvoidouter_f2(){

}
//静态内部类可以用public,protected,private修饰
//静态内部类中可以定义静态或者非静态的成员
staticclassInner{
staticintinner_i=100;
intinner_j=200;
staticvoidinner_f1(){
System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
}
voidinner_f2(){
//System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员
//outer_f2();//包括非静态变量和非静态方法
}
}

publicvoidouter_f3(){
//外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
//外部类访问内部类的非静态成员:实例化内部类即可
Innerinner=newInner();
inner.inner_f2();

}
publicstaticvoidmain(String[]args){
newOuter().outer_f3();
}

}

❷ Java匿名内部类

创建一个匿名类对象作为wrapping方法的返回值,同时重写了匿名类的value方法。
return的作用是结束当前方法(C语言里叫函数),看清楚return所在的方法。
要调用该方法才会执行里面的代码。
静态main方法是程序入口点。

❸ JAVA匿名类是什么,怎么用

匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。

内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部匿名定义。

匿名类与其他类的不同就在于匿名,也就是没有名称。

Java中允许创建子类对象时,除了使用父类的构造方法外,还可以用类体。 匿名类就是一个没有类申明的类体,因为没有名称,所有匿名类不可以申明对象,但却可以创建对象。 例如:

A是一个子类,那么下面的代码就是A的一个子类(匿名类)创建对象。

new A(){

匿名类的类体

};

由于匿名类是一个子类,所以和有一般子类的特征。可以继承父类的方法,同样也可以重写父类的方法。值得提醒的是,在使用匿名类时,一定是在某个类中直接用匿名类创建对象,因此匿名类必定是内部类,所以和其他匿名类一样可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以什么。

static成员变量和static方法。

尽管匿名类没有申明的步骤,但可以在创建匿名对象时返回一个引用赋值给匹配参数。 匿名类的常用方式是向方法的参数传值。

具体方法如下:

abstractclassSpeak{
publicabstractvoidspeakHello();
}
classStudent{
voidf(Speaksp){
sp.speakHello();
}
}
publicclassAnonymousClassDemo{
publicstaticvoidmain(String[]args){
Speakspeak=newSpeak(){
publicvoidspeakHello(){
System.out.println("大家好,祝工作愉快!");
}
};
speak.speakHello();
Studentst=newStudent();
st.f(newSpeak(){
publicvoidspeakHello(){
System.out.println("Iamastudent,howareyou");
}
});
}
}

上面代码的抽象类改成接口同样适用。

❹ 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 匿名内部类

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。

java 代码

interface pr
{
void print1();
}

public class noNameClass
{
public pr dest()
{
return new pr(){
public void print1()
{
System.out.println("Hello world!!");
}
};
}

public static void main(String args[])
{
noNameClass c=new noNameClass();
pr hw=c.dest();
hw.print1();
}
}

pr也可以是一个类但是你外部调用的方法必须在你的这个类或接口中声明外部不能调用匿名类内部的方法

Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。
如下:
java 代码

import java.awt.*;
import java.awt.event.*;

public class QFrame extends Frame {
public QFrame() {
this.setTitle(\"my application\");

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});

this.setBounds(10,10,200,200);
}
}

内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
}
new 是建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。
这个用法的作用是:创建一个对象的实例,并且 override 它的一个函数。打开 WindowAdapter 的代码可以发现。它是一个抽象类。它是对 WindowListener 接口的一个实现。Frame.addWindowListner(); 的参数是一个 WindowListner ,而实现上是传一个从WindowAdapter 派生出的一个匿名类。

1.怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。

先看段伪代码
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... } //这里就是有个匿名内部类
}
一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。
但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
其实拆分上面的匿名内部类可为
class SonOne extends Father{
... //这里的代码和上面匿名内部类,大括号中的代码是一样的
}
public class Test{
Father f1 = new SonOne() ;
}

2.匿名内部类的注意事项

注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

·内部类只能访问外部类的静态变量或静态方法。

匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名

3.匿名内部类的作用

Java的内部类和C++中的嵌套类有本质的不同:C++的嵌套类没有指向包装类的句柄。仅仅表达一个封装的概念;但是Java的内部类不同,它可以访问包装类的成员(这表示它拥有指向包装类的句柄)。
匿名内部类是内部类的一种简化写法:return new Wrapper {
...
};
等价于:Wrapped extends Wrapper {
...
}
return new Wrapped();

难道匿名内部类就只这一点作用吗?
考虑一下这样的case:

interface ICount {
int count();
}

class Parent {
int i = 0;
int count() {
return i++;
}
}
有一个类Child,它既想继承Parent的count()方法,又想实现ICount接口中的count方法,这个时候怎么办呢?内部类就可以大显身手了:
class Child extends Parent {
ICount getCount() {
return new ICount {
int i = 0;
int count() {
return (i *= 2);
}
}
}
}

至于你说的只有一个方法或者必须有返回值,这个倒是没有在语法上规定 , 所以应该不存在这一说法。

❻ java匿名内部类

这个类其实并没有实现两个接口的方法
匿名内部类的作用是灵活实现某个接口的方法解除依赖,你的Demo 类 implement 了 dianran,pool 两个接口,dr() 和 rs() 就是 Demo的成员方法 main 方法同级的 ;
Demo不需要实现两个接口就可以在实现两个方法如下:
interface dianran {
abstract void dr();
}
interface pool{
abstract void rs();
}
public class Demo {
public static void main(String args[]){
new dianran(){
@Override
public void dr() {
System.out.println("方法 dr");
}
}.dr();
new pool(){
@Override
public void rs() {
System.out.println("方法 rs");
}
}.rs();
}
}

❼ java内部类和匿名内部类的区别是什么

//匿名内部类甚至没有类名,(实际上有).
所以匿名内部类,只有一个实例,而且没有引用.
如下面那个Thread类的匿名子类,你不能重复使用.
内部类,内部类有名字,但是他在类的内部.

他能访问外部类的所有数据,包括private的.
甚至如果一个内部类,是在一个方法内的话,方法的局部变量,内部类也可以使用.
总体来说匿名内部类,和内部类效果差别不大.
在事件监听和线程应用中经常使用.

//匿名内部类
public class T1 {
public static void main(String[] args) {
new Thread() {
public void run() {
System.out.println("runing");
}
}.start();
}
}
//内部嵌套类
public class T1 {
private static final class Thread1 extends Thread {
public void run() {
System.out.println("runing");
}
}

public static void main(String[] args) {
new Thread1().start();
}
}

❽ JAVA中的匿名内部类

选B,C
A;匿名类与其说一个类,不如说他是一个表达式,因为写匿名类是在一个表达式里面写的,所以要注意写完一个匿名类后要在结尾写一个“:”
D;new Boo(String s){};这里的内部类虽然继承了Boo,但是这里实例化的类与Bar一点关系都没有(虽然他们都继承了Boo类,就像三角形和四边形继承自形状,你能说三角形是四边形吗)
E;匿名类不像普通的内部类,不要向E一样要Boo.Bar(String s){}; 这样写,这样写没有任何意义
new Bar(){} 和new Bar()的区别在于,第一个相当于继承了Bar类然后实例化Bar的子类对象(也就是说第一个是之类对象),后一个就是Bar对象
匿名类就是一个没有名字的,把继承类与实例化子类对象压缩在一个表达式里面
Boo(String s){}, Boo(){}这是统一各位类中的两个构造方法,没有什么关系,都是用来初始化对象的,一个是有参数的,一个是没有参数的,在实例化对象时,只能选择其中一个

❾ JAVA中局部内部类和匿名内部类的特点和作用是什么

Java 内部类
分四种:成员内部类、局部内部类、静态内部类和匿名内部类。
1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。
注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员。
public class Outer{
private static int i = 1;
private int j=10;
private int k=20;
public static void outer_f1(){
//do more something
}
public void out_f2(){
//do more something
}

//成员内部类
class Inner{
//static int inner_i =100; //内部类中不允许定义静态变量
int j=100;//内部类中外部类的实例变量可以共存
int inner_i=1;
void inner_f1(){
System.out.println(i);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
System.out.println(j);//在内部类中访问内部类自己的变量直接用变量名
System.out.println(this.j);//也可以在内部类中用"this.变量名"来访问内部类变量
//访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。
System.out.println(k);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
outer_f1();
outer_f2();
}
}
//外部类的非静态方法访问成员内部类
public void outer_f3(){
Inner inner = new Inner();
inner.inner_f1();
}

//外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
public static void outer_f4(){
//step1 建立外部类对象
Outer out = new Outer();
//***step2 根据外部类对象建立内部类对象***
Inner inner=out.new Inner();
//step3 访问内部类的方法
inner.inner_f1();
}

public static void main(String[] args){
outer_f4();
}
}
成员内部类的优点:
⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
2、局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。
注意:局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。
public class Outer {
private int s = 100;
private int out_i = 1;
public void f(final int k){
final int s = 200;
int i = 1;
final int j = 10;
class Inner{ //定义在方法内部
int s = 300;//可以定义与外部类同名的变量
//static int m = 20;//不可以定义静态变量
Inner(int k){
inner_f(k);
}
int inner_i = 100;
void inner_f(int k){
System.out.println(out_i);//如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(k);//*****可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的*****
// System.out.println(i);
System.out.println(s);//如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(this.s);//用"this.变量名" 访问的也是内部类变量
System.out.println(Outer.this.s);//用外部"外部类类名.this.变量名" 访问的是外部类变量
}
}
new Inner(k);
}

public static void main(String[] args) {
//访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}

}

注意:
在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。

3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。
注意:静态内部类中可以定义静态或者非静态的成员
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();
}

}

注意:*******生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。静态内部类不可用private来进行定义。*******

例子:
对于两个类,拥有相同的方法:
class People
{
run();
}
class Machine{
run();
}
此时有一个robot类:
class Robot extends People implement Machine.
此时run()不可直接实现。
注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。

4、匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA I=new IA(){};

匿名内部类的特点:

1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不需要知道其实际类型。
3,类名没有意义,也就是不需要使用到。

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();
}

}

注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。

________________________________________________________________________________

内部类总结:
1.首先,把内部类作为外部类的一个特殊的成员来看待,因此它有类成员的封闭等级:private ,protected,默认(friendly),public
它有类成员的修饰符: static,final,abstract
2.非静态内部类nested inner class,内部类隐含有一个外部类的指针this,因此,它可以访问外部类的一切资源(当然包括private)
外部类访问内部类的成员,先要取得内部类的对象,并且取决于内部类成员的封装等级。
非静态内部类不能包含任何static成员.
3.静态内部类:static inner class,不再包含外部类的this指针,并且在外部类装载时初始化.
静态内部类能包含static或非static成员.
静态内部类只能访问外部类static成员.
外部类访问静态内部类的成员,循一般类法规。对于static成员,用类名.成员即可访问,对于非static成员,只能
用对象.成员进行访问

4.对于方法中的内部类或块中内部类只能访问块中或方法中的final变量。

类成员有两种static , non-static,同样内部类也有这两种
non-static 内部类的实例,必须在外部类的方法中创建或通过外部类的实例来创建(OuterClassInstanceName.new innerClassName(ConstructorParameter)),并且可直接访问外部类的信息,外部类对象可通过OuterClassName.this来引用
static 内部类的实例, 直接创建即可,没有对外部类实例的引用。
内部类不管static还是non-static都有对外部类的引用
non-static 内部类不允许有static成员

方法中的内部类只允许访问方法中的final局部变量和方法的final参数列表,所以说方法中的内部类和内部类没什麽区别。但方法中的内部类不能在方法以外访问,方法中不可以有static内部类
匿名内部类如果继承自接口,必须实现指定接口的方法,且无参数
匿名内部类如果继承自类,参数必须按父类的构造函数的参数传递

阅读全文

与java内部匿名类相关的资料

热点内容
devc指针编译问题 浏览:998
支持dsd硬解压声卡 浏览:769
怎么查看u盘加密区 浏览:181
台电加密是什么格式 浏览:155
php论坛版块在哪个文件夹 浏览:442
暗黑的服务器为什么维护 浏览:624
android内存溢出的原因 浏览:18
标志307的压缩比是多少 浏览:636
服务器启动为什么叫三声 浏览:997
追风筝的人英文pdf 浏览:940
解压小熊手机壳 浏览:346
成都市区建成面积算法 浏览:661
智能家居单片机 浏览:97
买男装用什么app好 浏览:855
文件夹合并了怎么拆开 浏览:261
波段副图源码无未来函数 浏览:90
livecn服务器地址 浏览:259
程序员这个工作真的很吃香吗 浏览:848
程序员和数学分析师待遇 浏览:681
压缩气弹簧怎么拆 浏览:326