Java 内部类 学习笔记

目录

内部类

内部类基础知识

内部类的定义

内部类的本质

内部类的访问特点

成员内部类

获取内部类对象

静态内部类

局部内部类

匿名内部类


内部类

内部类基础知识

类的五大成员:成员属性、成员方法、构造方法、代码块、内部类

内部类的定义

内部类:在一个类里面,再定义一个类

例:在A类内部再定义一个类B,那么B叫做A的内部类

java 复制代码
public class Outer{
    public class Inner{

    }
}

例1

需求:写一个javabean类描述汽车。

属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限。

按照原来的理解,当作

java 复制代码
package Inner.I1;

public class Car {
    String CarName;
    int CarAge;
    String CarColor;
    String EngineName;
    int EngineAge;
}

但是,发动机的EngineName、EngineAge应当算作Engine类的成员变量

那么应当作

java 复制代码
package Inner.I1;

public class Car {
    String CarName;
    int CarAge;
    String CarColor;
}
class Engine{
    String EngineName;
    int EngineAge;
}

但是,发动机需要依赖车而存在的,那么我们需要把Engine类定义在car类内部,

使得车内存在发动机,而发动机两个变量又能是独立的个体

java 复制代码
package Inner.I1;

public class Car {
    String CarName;
    int CarAge;
    String CarColor;

class Engine{
    String EngineName;
    int EngineAge;
    }
}

此时称Car为外部类;Engine为内部类

内部类的本质

内部类是外部类的一部分,且单独出现没有任何意义

内部类的访问特点
  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,需要创建对象(不能直接访问)

特点分析

java 复制代码
package Inner.I1;

public class Car {
    String CarName;
    int CarAge;
    String CarColor;
    
     class Engine{
        String EngineName;
        int EngineAge;

        public Engine() {
        }

        public Engine(String engineName, int engineAge) {
            EngineName = engineName;
            EngineAge = engineAge;
        }
        public void show1(){
            System.out.println("车名:"+CarName+"车龄:"+CarAge+"车颜色:"+CarColor);
        }
        public void show2(){
            System.out.println("引擎名:"+EngineName+"引擎年龄:"+EngineAge);
        }
    }

    public Car() {
    }

    public Car(String carName, int carAge, String carColor) {
        CarName = carName;
        CarAge = carAge;
        CarColor = carColor;
    }
}

我们看到在内部类Engine中可以调用外部类方法

我们回答外部类中,发现独属于内部类的两个变量无法被调用

因为回顾之前类的知识,public voidn show()等价于public void show(Car this),调用CarName能被正常识别;但是Engine的EngineName非Car类。故无法被识别

我们需要调用,则得在外部类中创建内部类对象

成员内部类

成员内部类写在成员位置,属于外部类的成员

成员内部类可以被一些修饰符修饰,如public、static等,但一般地,成员内部类不会用static所修饰

在成员内部类中,JDK16以前不能定义静态变量

如此代码,即为成员内部类

获取内部类对象

方式一

外部类中编写方法,对外提供内部类的对象(一般是private)

方式二

直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象

java 复制代码
Outer.Inner oi = new Outer().Inner();

如果成员内部类被private修饰,那么外界无法访问

否则通过"外部类中编写方法,对外提供内部类的对象"

java 复制代码
package Inner.I1;

public class Outer {
    String name;
    private class Inner {
        String name;
    }
    public Inner getInner(){
        return new Inner();
    }
}
class test{
    public static void main(String[] args) {
        Outer outer = new Outer();
        Object obj = outer.getInner();//多态接收
        System.out.println(outer.getInner());
    }
}
java 复制代码
package Inner.I1;

public class NewOuter {
    private int a = 10;
    public int getA() {return a;}
    public void setA(int a) {this.a = a;}
    public NewOuter() {}

    class Inner{
            private int a = 20;

        public int getA() {return a;}

        public void setA(int a) {
            this.a = a;
        }

        public void show(){
                int a  =30;
                System.out.println("Inner-show()-start");
                System.out.println(a);//30
                System.out.println(this.a);//20
                System.out.println(NewOuter.this.a);//10
                System.out.println("Inner-show()-end");
            }
        }

}
class Test1{
    public static void main(String[] args) {
        NewOuter.Inner noi = new NewOuter().new Inner();
        noi.show();

        System.out.println(new NewOuter().getA());//10
        System.out.println(new NewOuter().new Inner().getA());//20
    }
}

静态内部类

静态内部类只能访问外部类中的静态变量 和静态方法,如果要访问外部类非静态成员,需要创建对象(静态只能访问静态)

创建静态内部类对象的格式:

java 复制代码
外部类名.内部类名 对象名 = new 外部类名.内部类名();

调用非静态方法的格式:先创建对象,用对象调用

调用静态方法的格式:

java 复制代码
外部类名.内部类名.方法名();

实验结论1·静态内部类只能直接访问外部类的静态方法

解决办法,在内部类中创建外部类的对象

实验结论2·调用内部类的格式

总结

局部内部类

  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里的局部变量
  • 外界无法直接访问,需要在方法内部创建对象并使用
  • 该类可以直接访问外部内部类的成员,也可以访问方法内部类的局部变量

实验结论1·局部内部类无法在外部直接访问

要解决调用问题,在内部类创建该对象

匿名内部类

匿名内部类的本质:隐藏了名字的内部类

格式: 注意添加分号

java 复制代码
new 类名或接口名(){
    @Override
    重写方法
};

如

java 复制代码
new Inner(){
    @Override
    public void show(){
        sout("重写方法");
    }
};

接口

类

无非是继承或实现的关系

未完

相关推荐
希和202731 分钟前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
前进的李工40 分钟前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
ever_you_love1 小时前
2026.11.9录屏笔记
笔记
li星野1 小时前
从 DICOM 到声学属性学习记录:HU 值怎么变成密度和声速
学习
希和20271 小时前
51 单片机按键控制 LED:江科大课程代码小白笔记
笔记·单片机·嵌入式硬件
希和20271 小时前
51 单片机 LED 流水灯:从直接法到循环法(江科大课程笔记)
笔记·单片机·mongodb
自信150413057591 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
架构师伯子明1 小时前
ffmpeg学习4:opencv在音视频领域常用指令
opencv·学习·ffmpeg
wangqiaowq14 小时前
Ontology 学习
学习