java内部类详解


前言


一、内部类

将一个类定义在另一个类或者方法的内部,前者为内部类,后者为外部类。
内部类是一个完整的结构,只为外部类服务。

1.实例内部类

在类里面,方法的外面
注意:在实例内部类中不能定义静态成员变量,因为静态不依赖对象。但是可以有静态常量(final)。
必须先实例化外部类,才能实例化内部类。
内部类也有单独的字节码文件:外部类$内部类
外部类的任何成员可以在实例内部类中直接访问。有同名,用this.访问内部的;用外.this.访问外部的。
在外部类调用内部类需要先实例化内部类。

class Outer{
    public int age;
    int price=80;
    class Inner{
        String name="张三";
        int price=33;
        public void sum(){
            System.out.println("总价");
            System.out.println(age);
            System.out.println(this.price);//内
            System.out.println(Outer.this.price);//外

        }
    }
    public void test(){
        Inner inner=new Inner();
        System.out.println("外部类调用内部类");
        System.out.println(inner.name);
    }
}

public class Test02 {
    public static void main(String[] args) {
        //初始化1
        Outer outer=new Outer();
        outer.test();
        Outer.Inner inner=outer.new Inner();
        inner.sum();
        //初始化2
        Outer.Inner inner2=new Outer().new Inner();
        inner2.sum();
    }
}

在这里插入图片描述

2.静态内部类

实例静态内部类中 Outer.Inner是一个整体,不要实例化外部类
外部类非静态成员内部类不能访问。但是如果必须访问外部,可以在内部类中new一个外部类对象,然后调用需要的即可。

class Outer{
    public int age;
    int price=80;
    static class Inner{
        String name="张三";
        int price=33;
        public static int sex=1;
        public void sum(){
            System.out.println("总价");
           // System.out.println(age);//报错
            Outer outer1=new Outer();
            System.out.println(outer1.age);//能访问外部

            System.out.println(price);//内
        }
    }
 
}

public class Test02 {
    public static void main(String[] args) {
        Outer.Inner inner=new Outer.Inner();//一个整体
        inner.sum();
    }
}

3.局部内部类

定义在外部类的方法或{}中,该内部类只能在其定义的方法内位置使用,使用很少。
不能被public,static等修饰符修饰。

class Outer{
    public int age;
    int price=80;
   public void test6(){
        class Inner{
           String name="张三";
           }
           Inner inner=new Inner();
       System.out.println(inner.name);//只能在此使用。
       }
   }

}

public class Test02 {
    public static void main(String[] args) {

    }
}

4.匿名内部类

interface shape{
    void draw();
}
public class Test03 {
    public static void main(String[] args) {
        int a=10;
        new shape(){//匿名内部类
            public void draw(){
               // a=88;但是之后在里面写a=88,会报错。在匿名内部类中,访问的变量是不可以改变的。
                System.out.println("矩形:"+a);
            }
        }.draw();//要调用,必须要.draw才能调
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值