目录
一、内部类
1.概述
将一个类A定义在另一个类B里面,则这个类A就被称为内部类,类B被称为外部类,
内部类表示的事物是外部类的一部分。内部类单独出现没有任何意义。
2.作用
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用。
例如用某个Javabean类描述汽车,属性:汽车的品牌、车龄、颜色、发动机品牌、发动机使用年限,可以看出后两个属性写在Car类中并不合适,由于发动机是汽车的一个组件,那么再单独创建一个Engine类也不合适,此时应该使用在Car类中定义一个内部类Engine
public class Car {//外部类
string carName;
int carAge;
int carColor;
class Engine {//内部类
string engineName;
int engineAge;
}
}
3.内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
4.内部类的使用
package test02;
public class car {
private String carName;
int carAge;
String carColor;
//内部类访问特点2:外部类要访问内部类的成员,必须创建对象
public void show(){
engine e =new engine();
System.out.println(e.engineName);
}
class engine{
String engineName;
int engineAge;
public void show(){
//内部类访问特点1:内部类可以直接访问外部类成员,包括私有
System.out.println(engineName);
System.out.println(carName);
}
}
}
package test02;
public class test {
public static void main(String[] args) {
car c =new car();
c.carAge=5;
c.show();
}
}
5.内部类的分类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
前三种很少使用,主要学习匿名内部类即可
二、成员内部类
1.概述
写在成员位置的,属于外部类的成员。例如上面的关于车与发动机的代码。
2.注意事项
- 成员内部类可以被一些修饰符所修饰,比如private,默认,protected,public,static
- jdk之后,成员内部类内部开始可以定义静态变量
3.获取成员内部类对象
方法一:在外部类中编写方法,对外提供内部类的对象
public class Outer {
String name;
private class Inner{
static int a = 10;
}
public Inner getInstance(){
return new Inner();
}
}
public class Test {
public static void main(String[] args) {
Outer o = new Outer();
System.out.println(o.getInstance());
}
}
方法二:直接创建,格式为:外部类名.内部类名 对象名 = 外部类对象.内部类对象
public class Test {
public static void main(String[] args) {
// 宿主:外部类对象。
// Outer out = new Outer();
// 创建内部类对象。
Outer.Inner oi = new Outer().new Inner();
oi.method();
}
}
class Outer {
// 成员内部类,属于外部类对象的。
// 拓展:成员内部类不能定义静态成员。
public class Inner{
// 这里面的东西与类是完全一样的。
public void method(){
System.out.println("内部类中的方法被调用了");
}
}
}
4.成员内部类获取外部类的成员变量
格式为:外部类名.this
public class Test {
public static void main(String[] args) {
Outer.inner oi = new Outer().new inner();
oi.method();
}
}
class Outer { // 外部类
private int a = 30;
// 在成员位置定义一个类
class inner {
private int a = 20;
public void method() {
int a = 10;
System.out.println(???); // 10 答案:a
System.out.println(???); // 20 答案:this.a
System.out.println(???); // 30 答案:Outer.this.a
}
}
}
三、匿名内部类
1.概述
本质上就是隐藏了名字的内部类
2.格式
new 类名或者接口名() {
重写方法;
};