内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。

内部类分为:

  1. 成员内部类(可以用修饰符进行修饰)
  2. 局部类(匿名内部类)(局部只供成员方法内部使用)

成员内部类访问特点:

  • 内部类可以直接访问外部类的成员包括私有的
  • 外类需要创建内部类对象才能访问内部类成员包括私有的
public class Demo05 {
    private int i =10;
    int j = 20;
    public void method(){
        Test test = new Test(); //外部类需要创建内部类对象才能访问内部类成员(包括私有成员)
        test.method();
        test.method01();
        System.out.println(test.z);
    }
    public void method1(){
    }
    class Test{
        int j = 30;
        private int z = 40;
        public void method(){
            System.out.println(i);      //不同名的调用的是外部类成员变量       10
            System.out.println(j);      //同名的调用的是内部类的成员变量       30
            System.out.println(Demo05.this.j);  //同名的访问外部类的成员变量格式  外部类名称.this.成员变量
            method1();      //不同名的谁有调用谁
            method01();        //不同名的谁有调用谁
            method();       //同名的调用的是内部类的方法
            Demo05.this.method();   //同名的要调用外部类的方法格式  外部类名称.this.方法名
        }
        public void method01(){
        }
    }
}

创建内部类对象格式:

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

局部内部类的使用

局部内部类访问所在方法的局部变量,该变量经赋值后不能更改即final修饰,,默认可以不写

原因:

方法在栈内存中,对象在堆内存中,方法出栈后,对象可能还在堆中,还想再访问该值如果不是常量则无法访问

public class Demo05 {
    private int i =10;
    int j = 20;
    public void method1(){
        int i = 100;
        class Test{             //局部内部类
            int j = 200;
            public void method(){
                System.out.println(i); //局部内部类访问所在方法的局部变量,这个变量经赋值后不能改变
                System.out.println(Demo05.this.j);  //外部类的成员
            }
        }
        Test test = new Test();
        test.method();    //调用局部内部类中的方法
    }

 匿名内部类

是局部内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象。

匿名内部类

匿名对象

public class Demo01 {
    public static void main(String[] args) {
       Demo01 demo01 = new Demo01();
       demo01.method1();
          //匿名对象的匿名内部类
       demo01.method02(new Portplm() {            //使用了多态
           @Override
           public void method() {
               System.out.println("实现接口的匿名内部类以及匿名对象");
           }
       });
    }
    public void method1(){
        //匿名内部类
        Portplm portplm = new Portplm() {
            @Override
            public void method() {
                System.out.println("实现接口的匿名内部类!!!");
            }
        };
        method02(portplm);        //使用了多态
    }
    public void method02(Portplm portplm){
            portplm.method();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值