【零基础学Java】第十五篇 Java基础中的重难点—内部类

📄个人简介
🔔作者简介:大家好,我是小学生!!🙈大二学生一枚,目前正在自学Java,如果大家觉得我写的还不错的话,希望大家给我点赞👍+收藏⭐+评论📢,有什么写的不对的地方还请大家多多指教🙏,共同进步。
📝个人主页:小学生!!
📖系列专栏
🌕阶段一:Java基础编程
💦目前已原创15篇

🌕阶段二:数据结构与算法
🌕阶段三:操作系统
🌕阶段四:计算机网络

在这里插入图片描述


前言

🔥本文主要介绍了内部类的基本语法以及四种内部类:局部内部类,匿名内部类(重点),成员内部类,静态内部类的使用和注意事项。内部类很很很重要!!!!!!


内部类

1.基本介绍

一个类的内部又嵌套了另一个类,被嵌套的类叫做内部类。被嵌套的其他类叫做外部类。

内部类可以直接访问私有属性。

2.基本语法

class Outer{//外部类    
   class Inner{//内部类
   }
}
class Other{//外部其他类
}

3.内部类的分类

1.定义在外部类的局部位置上(比如方法):

①局部内部类(有类名)

②匿名内部类(无类名,重要)

2.定义在外部类的成员位置上:

①成员内部类(没有static修饰)

②静态内部类(有static修饰)

1.局部内部类的使用

1.局部内部类,必须定义在局部位置(方法/代码块),有类名。

2.不能添加访问修饰符,地位相当于局部变量,但可以用final修饰。

3.外部类访问局部内部类,创建内部类对象,必须在作用域内。

4.外部类同样能访问内部类的所有成员。

5.局部内部类可直接访问外部类的所有成员包括私有的

6.作用域在方法或代码块中,所以外部其他类不能访问局部内部类。

7.当内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.this.成员名。

class Outer {//外部类
    private int a = 100;

    { //1.局部内部类,必须定义在局部位置(方法/代码块),有类名
        class Inner02 {
        }
    }

    public void m1() {

        //2.不能添加访问修饰符,地位相当于局部变量
        final class Inner01 {//但可以用final修饰
            private int a = 10;

            public void display() {
                //可直接访问外部类的所有成员包括私有的
                System.out.println(a);
            }
        }
        //3.外部类访问局部内部类,创建内部类对象
        Inner01 inner01 = new Inner01();
        //4.外部类同样能访问内部类的所有成员
        //5.当内部类的成员与外部类重名时,遵循就近原则
        //若想直接访问外部类采用外部类名.this.成员名
        System.out.println("内部类 a = " + inner01.a +"\n"+ "外部类 a = " + Outer.this.a);
        inner01.display();

    }

}

2.匿名内部类的使用(重点)

1.基本语法

new 类或接口名(参数列表){类体};

2.匿名内部类既是一个类的定义,同时还是一个对象

3.匿名内部类使用一次就不能再用。

4.匿名内部类,必须定义在局部位置(方法/代码块),不表现出类名,但底层会分配类名。

5.不能添加访问修饰符,地位相当于局部变量。

6.作用域在方法或代码块中,所以外部其他类不能访问匿名内部类。

7.当内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.this.成员名。

8.匿名内部类可直接访问外部类的所有成员包括私有的。

9.匿名内部类还可当做实参直接传递。

public class InnerClass02 {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
       //9.匿名内部类还可当做实参直接传递。
        outer02.m2(new A() {
            @Override
            public void cry() {
                System.out.println("小猫在哭。。。");
            }
        });

    }
}
interface A {
    void cry();
}

class Outer02 {
    //1.基本语法
    //new 类或接口名(参数列表){类体};
    private int a = 100;

    public void m2(A a) {
        a.cry();
        //基于接口
        A Dog = new A() {
            //2.匿名内部类既是一个类的定义,同时还是一个对象
            //Dog的编译类型为A,运行类型为匿名内部类 Outer02$1
            //JDk底层在创建匿名内部类 Outer02$1,立即就会创建Outer02$1的实力,并且将地址返回给Dog
            //3.匿名内部类使用一次就不能再用。
            /*
            底层会分配类名 Outer02$1
            class Outer02$1 implements A{
               @Override
               public void cry() {
                 System.out.println("小狗在哭。。。");
               }
            }
             */
            @Override
            public void cry() {
                System.out.println("小狗在哭。。。");
            }
        };
        Dog.cry();
         //基于类
        new Person("Bob") {
            /*
           底层会分配类名 Outer02$2
           class Outer02$2 extends Person{
              public void show() {
                //8.直接访问外部类所有成员
                System.out.println("外部类 a = " + a);
            }
           }
            */
            public void show() {
                //8.可直接访问外部类所有成员
                System.out.println("外部类 a = " + a);
            }
        }.display();
    }
}

class Dog {
}
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    void display() {
        System.out.println("Bob在工作。。。");
    }
}

3.成员内部类的使用

1.成员内部类是定义在外部类的成员位置,并没有static修饰。

2.可以直接访问外部类的成员,包括私有的。

3.可以添加任意访问修饰符(public,protected,默认的,private),地位是一个成员。

4.作用域是整个类体。

5.成员内部类可直接访问外部类的成员,外部类访问要先创建对象再访问。

6.外部其他类访问成员内部类。方法1,方法2。

7.当内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.this.成员名。

public class InnerClass03 {

    public static void main(String[] args) {
        //方法1
        Outer03 outer03 = new Outer03();
        Outer03.Inner03 inner03 = outer03.new Inner03();
        inner03.display();
        //方法2
        inner03 = outer03.getInstance();
        inner03.display();
    }
}

class Outer03 {
    private int a = 100;

    public class Inner03 {
        private int a = 10;

        void display() {
            //7.当内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.this.成员名。
            System.out.println("内部类" + a + "+" + "外部类" + Outer03.this.a);
        }
    }
  void show() {
        Inner03 inner03 = new Inner03();
        System.out.println(inner03.c);
    }
    public Inner03 getInstance() {
        return new Inner03();
    }
}

4.静态内部类的使用

1.静态内部类是定义在外部类的成员位置,并没有static修饰。

2.可以直接访问外部类的静态成员,包括私有的。

3.可以添加任意访问修饰符(public,protected,默认的,private),地位是一个成员。

4.作用域是整个类体。

5.静态内部类可直接访问外部类的成员,外部类访问要先创建对象再访问,静态成员还可直接采用静态内部类名.成员名。

6.外部其他类访问静态内部类。方法1,方法2。

7.当静态内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.成员名。

public class InnerClass03 {

    public static void main(String[] args) {
        Outer03.Inner03.display();
        //方法1
        Outer03.Inner03 inner03 = new Outer03.Inner03();
        System.out.println(inner03.c);
        //方法2
        Outer03.Inner03 instance = Outer03.getInstance();
        System.out.println(instance.c);
    }
}

class Outer03 {
    static private int a = 100;

    static class Inner03 {
        static private int a = 10;
        int c = 23;

        static void display() {
            //7.当静态内部类的成员与外部类重名时,遵循就近原则,若想直接访问外部类采用外部类名.成员名。
            System.out.println("内部类" + a + "+" + "外部类" + Outer03.a);
        }
    }
    void show() {
        //5.静态内部类可直接访问外部类的成员,外部类访问要先创建对象再访问
        Inner03 inner03 = new Inner03();
        System.out.println(inner03.c);
         //静态成员还可直接采用静态内部类名.成员名。
        Inner03.display();
        System.out.println(Inner03.a);
    }

    public static Inner03 getInstance() {
        return new Inner03();
    }
}
  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 38
    评论
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值