JAVA学习 内部类

目录

5.1 创建内部类

5.2 成员内部类

5.3 匿名内部类

5.4 局部内部类

5.5 静态内部类


5.1 创建内部类

        内部类就是在一个类的内部再定义一个类。内部类可以是静态的也可以用public、default

protected和private修饰,而外部类只能使用public和default修饰。

        内部类只是一个概念,一旦编译成功,就会和外部类成为两个完全不同的类。所以内部类的成员变量、方法名可以和外部类相同。

实例:

public class OuterC {
    public void showOuterC() {
        System.out.println("这是外部类");
    }
    public class InnerC {
        public void showInnerC() {
            System.out.println("这是内部类");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        OuterC.InnerC ic = new OuterC().new InnerC();
        ic.showInnerC();
    }
}

5.2 成员内部类

         成员内部类是最普通的内部类,在成员内部类中可以访问外部类的全部成员。成员内部类的使用方法:

  • 成员内部类定义在外部类的内部,相当于外部类的一个成员变量,成员内部类可以使用任意访问修饰符
  • 成员内部类的方法可以直接访问外部类的所有数据,包括私有数据
  • 定义了内部类后,就必须用外部类对象来创建内部类对象即:
    内部类 对象名 = 外部类对象.new内部类();
  • 成员内部类class文件格式为“外部类名$内部类名.class”
  • 外部类不能直接使用内部类的方法和成员。可先创建内部类的对象,再通过内部类的对象来访问
  • 如果外部类和内部类具有相同的成员变量和方法,内部类默认访问自己的成员变量和方法。如果内部类要访问外部类的成员变量和方法,可以使用this关键字(外部类名.this)
  • 外部类的外部要声明完整,如外部类名.内部类名

实例:

public class Outer {
    private int a = 100;
    int b = 5;

    public class Inner {
        int b = 3;

        public void test(){
            System.out.println("访问外部类中的a:" + a);
            System.out.println("访问外部类中的b:" + Outer.this.b);
        }
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        Inner i = o.new Inner();
        i.test();
    }
}

 内部类访问外部类的变量b需要通过Outer.this.b

 创建内部类对象需要通过外部类对象o实现,Inner i = o.new Inner();

5.3 匿名内部类

 匿名内部类是没有名字的内部类,多用于关注实现而不关注类的名称。

实例:

   button2.addActionListner(
          new ActionListener() {
                public void actionPerformed (ActionEvent e){
                    System.out.println("单机了button2");
                }
   });

本例中,为button2添加了一个事件监听器,addActionListener()方法的参数是一个匿名内部类。

        匿名内部类是唯一没有构造器的类。大部分匿名内部类用于接口回调,命名时自动规范为Outter$1.class。一般来说,匿名内部类用于继承其他类或实现接口,不需要为它添加其他的方法。

5.4 局部内部类

局部内部类是作用域一个方法内或一个作用域内的类,它和成员内部类的区别在于,局部内部类只能访问方法内或作用域内。局部内部类,不能使用访问修饰符和static修饰符。

实例:(定义在方法内)


public class People {
    public People(){

    }
}
public class Man {
    public Man(){

        public People getWoman(){
            class Woman extends People{
                int age = 0;
            }
            return new Woman();
        }
    }
}

定义在作用域内:


public class Test {
    private void internalTracking(boolean b) {
        if(b) {
            class TrackingSlip{
                private  String id;
                TrackingSlip(String s) {
                    id = s;
                }
                String getSlip() {
                    return id;
                }
            }
            TrackingSlip ts = new TrackingSlip("chenssy");
            String string = ts.getSlip();
        }
    }
    public void track() {
        internalTracking(true);
    }

    public static void main(String[] args) {
        Test t1 = new Test();
        t1.track();
    }
}

5.5 静态内部类

        静态内部类也是定义在类中的类,不过加了一个static关键字。有如下特点:

  • 静态内部类不能直接访问外部类的非静态成员,但可以通过“new 外部类().成员”的方式访问
  • 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态名”访问外部类的静态成员
  • 创建内部类中对象时,不需要外部类对象,可直接创建,格式为:内部类名 对象名 = new 内部类名()

实例:

public class Outer {
    private int a = 100;
    static int b = 5;

    public static class Inner{
        int b = 3;

        public void test(){
            System.out.println("外部类的b:" + Outer.b);
            System.out.println("内部类的b:" + b);
            System.out.println("外部类的非静态变量a:" + new Outer().a);
        }
    }

    public static void main(String[] args) {
        Inner inner = new Inner();
        inner.test();
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值