通过之前对 JAVA基础 —— 面向对象 以及 JAVA基础 —— 面向对象内存图 的学习。
接下来我们将会进一步学习面向对象进阶的相关知识点。
static | JAVA基础 (面向对象进阶)—— Static |
继承 | JAVA基础 (面向对象进阶)—— 继承 |
多态 | JAVA基础 (面向对象进阶)—— 多态 |
包、final、权限修饰符、代码块、抽象类和抽象方法方法 | JAVA基础(面向对象进阶) —— 包、final、权限修饰符、代码块、抽象类和抽象方法方法 |
接口 | JAVA基础 (面向对象进阶)—— 接口 |
内部类 | JAVA基础 (面向对象进阶)—— 内部类 |
目录
一、内容概述
1. 什么是内部类?
类的五大成员:属性、方法、构造方法、代码块、内部类
内部类:就是在一个类的里面,再定义一个类。
举例:在A类的内部定义B类,B类就被称为内部类。
2. 为什么要学习内部类?
需求:写一个Javabean类描述汽车。
属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限。
发动机相关属性不应该直接和车定义在一起。 | |
总结:
|
3. 内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
//Car.java
public class Car {
String carName;
int carAge;
String carColor;
public void show() {
// public void show(Car this){隐藏this
// 打印车名字是打印调用者的车名字
System.out.println(carName);
// 报错!
// ??? 在代码中没有发动机对象
// System.out.println(engineName);
// 所有要创建对象
Engine e = new Engine();
System.out.println(e.engineName);
}
class Engine {
String engineName;
int engineAge;
public void show() {
// 内部类可以直接访问外部类成员,包括私有
System.out.println(engineName);
System.out.println(carName);
}
}
}
//Test.java
public class Test {
public static void main(String[] args) {
Car c = new Car();
c.carName = "宾利";
c.carAge = 1;
c.carColor = "粉色";
c.show();
}
}
二、 内部类的分类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
注意:成员内部类、静态内部类、局部内部类了解即可,一般在看源代码才会看到;但是匿名内部类需要重点掌握。
1. 成员内部类
- 写在成员位置的,属于外部类的成员。
- 成员内部类可以被一些修饰符所修饰,比如:private、默认、protected、public、static等。
- 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
1.1 获取成员内部类对象
- 方法一: 在外部类中编写方法,对外提供内部类的对象
- 方法二:直接创建格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象; 范例: Outer.Inter oi = new Outer().new Inter();
1.2 成员内部类如何获取外部类的成员变量
通过面试题了解:
2. 静态内部类
- 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。
创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
- 调用非静态方法的格式:先创建对象,用对象调用
- 调用静态方法的格式:外部类名.内部类名.方法名();
//Outer.java
public class Outer {
// int a=10;
// static int b = 20;
// 静态内部类
static class Inter {
public void show1() {
System.out.println("非静态方法被调用了");
}
public static void show2() {
System.out.println("静态类方法被调用了");
}
}
}
public class Test {
public static void main(String[] args) {
//创建静态内部类的对象
//只要是静态的东西,都可以用类名直接获取
Outer.Inter oi = new Outer.Inter();
//非静态方法调用
oi.show1();
//静态方法调用
Outer.Inter.show2();
}
}
3. 局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部内部类。
- 外界是无法直接使用,需要在方法内部创建对象并使用。
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
public class Outer {
// 外部类成员变量
int b = 20;
public void show() {
// 局部变量
int a = 10;
// 局部内部类
class Inter {
String name;
int age;
public void method1() {
System.out.println(a);
// 访问外部类成员
System.out.println(b);
System.out.println("局部内部类中的method1方法");
}
public static void method2() {
System.out.println("局部内部类中的method2静态方法");
}
}
// 创建内部类对象
Inter i = new Inter();
System.out.println(i.name);
System.out.println(i.age);
i.method1();
Inter.method2();
}
}
public class Test {
public static void main(String[] args) {
//无法直接使用show方法中的局部变量a
Outer o = new Outer();
//报错: 此时a为成员变量a 不是局部变量a
//需要在方法内部创建对象
//o.a;
//调用show方法
Outer o1 = new Outer();
o1.show();
}
}
4. 匿名内部类
匿名内部类本质上就是隐藏了名字的内部类,可以写在成员为止,也可以写在局部位置。
- 格式的细节:
包含了继承或实现,方法重写,创建对象
整体就是一个类的子类对象或者接口的实现类对象
- 使用场景:
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象
如果实现类只要使用一次,就可以用匿名类简化代码。