Java——内部类

1.什么是内部类

在一个类的里面再定义一个类,新定义的这个类就是内部类

举例:在Outer类的里面定义一个Inter类

复制代码
class Outer{
    class Inter{
        
    }
}

在这里Outer叫外部类,Inter叫内部类


内部类的应用场景

定义一个汽车类:

属性:汽车品牌,型号,价格,发动机的型号和使用年限的等等

这里发动机是一个独立的个体,但是又依附于汽车,单独纯在没有意义

代码示例:

复制代码
class Car{           //汽车类
    String carName;
    int carAge;
    int carPrice;
    class Engine{     //发动机
        String engineName;
        int engineAge;
    }
}

注意:

内部类表示的事物是外部类的一部分

内部类单独出现没有任何意义


内部类的访问特点

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

2.外部类要访问内部类的成员,必须创建对象

2.成员内部类

1.成员内部类是写在成员位置的,属于外部类的成员(上述Enging类就是成员内部类)

2.成员内部类可以被一些修饰符所修饰,比如:private,default(默认),protected,public,static(被static修饰的成员内部类叫静态内部类)

3.在成员内部类里面,JDK16之前不能定义静态变量,JDK16以后才可定义静态变量

如何获取成员内部类

1.直接创建

格式:

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

2.外部类编写方法,对外提供内部类对象

样例:

复制代码
class Car{
    String carName;
    int carAge;
    int carPrice;
//private修饰的内部类,main无法访问,也不能使用外部类.出来
    private class Engine{
        String engineName;
        int engineAge;
    }
//获取内部类的方法
    public Engine getinstance(){
        return new Engine();
    }

}
public class T1 {
    public static void main(String[] args) {
//方法1:创建一个外部类对象,用Object形成多态接收内部类
Car car=new Car();
Object en=car.getinstance();
//方法二,直接使用内部类
Car car1=new Car();
        System.out.println(car1.getinstance());
    }
}

成员内部类面试题:

复制代码
class Outer{
    int a=10;
    class Inter{
        int a=20;
        public void show(){
            int a=30;
            System.out.println();//打印10
            System.out.println();//打印20
            System.out.println();//打印30
        }
    }
}

当变量名不同使,直接调用即可

当外部类和内部类还有局部的变量名相同时,直接打印会遵循就近原则

想要打印分别打赢就可以按下面这种方式调用

复制代码
class Outer{
    int a=10;
    class Inter{
        int a=20;
        public void show(){
            int a=30;
            System.out.println(Outer.this.a);//打印10
            System.out.println(this.a);//打印20
            System.out.println(a);//打印30
        }
    }
}

3.静态内部类

1.静态内部类就是被static修饰的成员内部类

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

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

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

4.调用静态内部类中非静态的方法:先创建对象,使用对象调用

5.调用静态内部类中的静态方法:外部类名.内部类名.方法名();

4.局部内部类

1.将内部类定义在方法里面的类就叫做局部内部类,类似与方法中的局部变量

2.外界无法直接使用,需要在方法内部创建对象并使用

3.该类可以直接访问外部类的成员,也可访问方法类的局部变量

5.匿名内部类(重点)

匿名内部类本质上就是隐藏了名字的内部类

格式:

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

举例:
new Inter(){
public void show(){
     }
}

遵循编译看左边,运行看右边的原则

复制代码
Swin s=new Swin(){//实现了多态
public void swin(){
sout("重写接口里面swin的方法");
}
};
s.swin();

匿名内部类是一个对象,可以直接点方法调用自己类里面的方法

复制代码
new Swin(){
public void swin(){
sout("重写接口里面swin的方法");
}
}.swin();

使用场景:

1.当方法的参数是接口或者类时

2.以接口为例,可以传递这个接口的实现类对象

3.如果实现类只要使用一次,就可以使用匿名内部类简化代码

注意:匿名内部类可以写在局部位置也可以写在成员位置

相关推荐
寒士obj1 分钟前
Spring事物
java·spring
柯南二号1 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
阿珊和她的猫4 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234177 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~7 小时前
C#---StopWatch类
开发语言·c#
桦说编程8 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen8 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研8 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员9 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋9 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat