目录
内部类
内部类基础知识
类的五大成员:成员属性、成员方法、构造方法、代码块、内部类
内部类的定义
内部类:在一个类里面,再定义一个类
例:在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("重写方法");
}
};
接口

类

无非是继承或实现的关系
未完
