当前位置: 主页 > JAVA语言

java匿名内部类详解-java匿名类

发布时间:2023-02-09 10:49   浏览次数:次   作者:佚名

内部类:一个类在另一个类中

如:身体与心脏的关系,汽车与发动机的关系

分类:(1)成员内部类

(2)局部内部类(包括匿名内部类)

成员内部类:

定义格式:修饰类外部类名{

修饰类内部类名{}}

注:内用外用,免费获取; 对于外部使用内部使用,需要一个内部类对象

public class Body {//外部类
    int num;//外部类成员变量
    public class Heart{//内部类
        public void beat(){
            System.out.println("心脏");
            System.out.println(num);//内部类访问外部类,直接访问
        }
    }
}

内部类的使用:

(1)间接方式:在外部类的方法中,使用内部类; 主函数调用外部类的方法

public class Body {//外部类
    int num;//外部类成员变量
    public class Heart{//内部类
        public void beat(){
            System.out.println("心脏");
            System.out.println(num);//内部类访问外部类,直接访问
        }
    }
    void method(){
        System.out.println("外部类方法执行");
        Heart heart =new Heart();
        heart.beat();//外部类方法间接访问内部类
    }
}

(2)直接方式:直接创建内部类

外部类名.内部类名对象名 = new 外部类名().内部类名();

        Body.Heart heart=new Body().new Heart();
        heart.beat();

内部类的重复名称:

使用外部类.this访问外部类,this访问内部类java匿名内部类详解,outer访问外部类

java匿名内部类的使用_java匿名类_java匿名内部类详解

局部内部类:

定义:类定义在方法内部

特点:只有当前方法可以使用内部类

格式:public class { method () { class }}

使用:在方法中定义一个局部内部类,在main函数中调用外部类对象。 方法

package 内部类;
public class Body {//外部类
    void method(){
         class Heart{//局部内部类
            public void beat(){
                System.out.println("心脏");
            }
        }
        //在方法中定义局部内部类 使用局部内部类
         Heart heart=new Heart();
         heart.beat();
    }
}
Body a=new Body();
a.method();

为类定义权限修饰符

外部类:公共/(默认)

成员内部类:public/protected/(default)/private

局部内部类:只有所属的方法可以访问java匿名内部类详解,什么都不能写

内部类的最后

java匿名内部类的使用_java匿名类_java匿名内部类详解

如果局部内部类访问方法的局部变量,那么这个局部变量必须是[valid final],(加final关键字或者只赋值一次)

原因:

新对象在堆内存中

●局部变量跟随方法,在栈内存中

方法运行结束后,立即出栈,局部变量立即消失

●但是新对象会一直存在于堆中,直到垃圾回收消失

所以如果new对象访问的是局部变量,局部变量是常量,可以复制一份,防止局部变量消失

匿名内部类:

简介:如果接口的实现类(或者父类的子类)只需要使用唯一一个

在这种情况下,您可以省略类的定义并使用 [匿名内部类] 代替。

定义格式:接口名对象名=新接口名(){//覆盖所有抽象方法}

public interface MyInterface {
    void method();
}
public class Dmeo {
    public static void main(String[] args) {
      MyInterface obj=new MyInterface() {
          //下面的代码块是匿名内部类,覆盖重写了接口的方法
          @Override
          public void method() {
              System.out.println("匿名内部类实现了方法");
          }
      };
    }
}
obj.method();//匿名内部类实现了方法

优点:可以单独保存一个类的定义

防范措施:

1.new表示创建对象的动作

2.接口名是匿名内部类需要实现的接口

3. {...} 匿名内部类的内容

4.匿名内部类在创建对象时只能使用一次。

5.匿名内部类也可以省略对象名,直接写成new interface(){}。 方法,并成为匿名对象

匿名对象只能在[调用方法]时被调用一次

java匿名内部类的使用_java匿名类_java匿名内部类详解

java匿名内部类的使用_java匿名类_java匿名内部类详解

6.匿名内部类省略[实现类/子类名],但匿名对象省略[对象名]