Java----内部类

Java----内部类

非静态内部类
静态内部类
匿名内部类
局部内部类

一、非静态内部类

内部类可以直接使用外部类的成员,但是外部类不能直接访问内部类的成员

内部类创建对象必须通过外部类,内部类的成员使用也需要通过外部类创建对象

内部类和外部类进行编译之后生成的是两个不同的类

非静态内部类中不能定义静态的成员

package com.company.testInnerClass;

public class outer1 {

    private int age = 10;

    void run()
    {
        System.out.println(age);
    }
    //普通内部类
    class inner1{
        //定义和外部类重名的属性
        private int age = 20;

        void m2(){
            //内部类中可以直接调用外部类中的方法和属性
            run();

            //打印的是当前内部类中属性值
            System.out.println(age);

            //如果要调用外部类中与内部类重名的属性,可以通过外部类.this.属性名调用
            System.out.println(outer1.this.age);

        }
    }

    public static void main(String[] args) {

        //使用内部类必须通过外部类的对象

        //内部类的对象构建方法
        outer1.inner1 n01 = new outer1().new inner1();

        //第二种方法
        outer1 o01 = new outer1();
        inner1 n02 = o01.new inner1();

        n01.m2();
        System.out.println("--------------");
        n02.m2();
    }
}

在这里插入图片描述

二、静态内部类

静态内部类中可以直接访问外部类的静态成员,但不能访问非静态成员

静态内部类中的对象创建只能通过( 内部类 对象名 = new 外部类.内部类(); )的方法创建

package com.company.testInnerClass;

public class outer2 {

    private int a = 10;
    private static int b = 5;

    static class inner2 {

        public void test()
        {
            //静态内部类可以访问外部类的静态成员,但不能访问外部类的非静态成员
            /*System.out.println(a);*/    //a会报错


            System.out.println(b);

        }
    }

    public static void main(String[] args) {

        //创建静态内部类的对象只能使用下面的第二种方法
        
/*        outer2 o1 = new outer2();
        inner2 n1 = o1.new inner2();*/

        inner2 n02 = new outer2.inner2();
        n02.test();
    }
}

在这里插入图片描述

匿名内部类

匿名内部类使用之后就没了,定义一次用一次

在定义匿名内部类时要注意语法格式,定义在对象调用方法的括号中充当参数的位置

package com.company.testInnerClass;

/*
* 匿名内部类
*/

public class outer3 {

    public void test(A a)
    {
        a.run();
    }
    public static void main(String[] args) {

        //创建outer3对象
        outer3 o1 = new outer3();

        //匿名内部类
        o1.test(new A(){
        public void run(){
            System.out.println("outer3.run");
        }
        });
    }
}

interface A{
    void run();
}

在这里插入图片描述

局部内部类

局部内部类只能在定义的方法中使用

package com.company.testInnerClass;

/*局部内部类*/

public class outer4 {
    public void run(){

        //创建局部内部类
        class inner4{
            public void run2(){
                System.out.println("inner4.run2");
            }
        }

        //创建内部类对象调用run2()方法
        new inner4().run2();
    }

    public static void main(String[] args) {

        //创建外部类对象调用方法
        outer4 o1 = new outer4();
        o1.run();
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值