0
点赞
收藏
分享

微信扫一扫

java 内部类


一个类内部包含另一个类,被包含的类则称为内部类。例如汽车类中包含发动机类,发动机类可称为内部类。内部类可分为:成员内部类和匿名内部类

成员内部类

/**
* 汽车类中包含发动机内部类
*/
public class Car {

private Engine engine;

public Engine getEngine() {
return engine;
}

public void setEngine(Engine engine) {
this.engine = engine;
}

public void carStart() {
engine.start();
}

public void carStop() {
engine.stop();
}

//成员内部类
public class Engine {
private String name;

private String manufacturer;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getManufacturer() {
return manufacturer;
}

public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}

private void start() {
System.out.println("发动机发动");
}

private void stop() {
System.out.println("发动机停止");
}
}
}

public class CarTest {
public static void main(String[] args) {

Car car = new Car();
//外部类名称.内部类名称 对象名= new 外部类名称().内部类名称()
Car.Engine engine = new Car().new Engine();
engine.setName("EA888");
engine.setManufacturer("大众");

car.setEngine(engine);
car.carStart();
car.carStop();

}
}

局部内部类

只有当前所属的方法才能使用,在方法外部不能使用

public class LocalCar {

public void start() {

//在成员方法中定义局部内部类
class Engine {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void start() {
System.out.println(this.name + "发动机启动");
}
}

Engine engine = new Engine();
engine.setName("EA888");
engine.start();
}

public void stop() {
//错误,stop方法无法访问在start方法中定义的局部内部类
//Engine engine = new Engine();
}
}

局部内部类访问局部变量的限制

public class LocalCar {

public void start() {

int length = 50;

//在成员方法中定义局部内部类
class Engine {

public void start() {
//在java 8之前,局部内部类如果要访问方法的局部变量,则该局部变量必须加上final关键字修饰
//在java 8开始,只要局部变量不变,final关键字可以省略
System.out.println(length);
//局部变量存在于栈内存中,在方法运行结束之后会立刻消失,
//但是局部对象在堆内存中持续存在,直到垃圾回收消失,所以局部内部类访问局部变量,该局部变量不能发生变化
//length=60; 该语句错误,因为局部变量length实际是以final关键字修饰的
System.out.println("发动机启动");
}

}

Engine engine = new Engine();
engine.start();
}

public void stop() {
//错误,stop方法无法访问在start方法中定义的局部内部类
//Engine engine = new Engine();
}
}

匿名内部类

如果接口的实现类(或者定义父类的子类)只需要用到唯一的一次,则可以省略该实现类的定义,而直接使用匿名内部类。且匿名内部类也可以用lambda表达式代替。

public interface AnonymousInterface {
void method();
}

public class AnonymousClass {

AnonymousInterface anonymousInterface = new AnonymousInterface() {
@Override
public void method() {
System.out.println("匿名内部类实现方法");
}
};
}
//以上代码用lambda表达式代替如下:
public class AnonymousClass {
AnonymousInterface anonymousInterface = () -> System.out.println("匿名内部类实现方法");
}

匿名内部类的应用:接口作为成员变量的类型

public interface School {

void goSchool();
}

public class AnonymousMember {

private String name;

private int age;

private School school;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public School getSchool() {
return school;
}

public void setSchool(School school) {
this.school = school;
}
}

public class AnonymousMemberTest {
public static void main(String[] args) {
AnonymousMember anonymousMember = new AnonymousMember();
anonymousMember.setName("小明");
anonymousMember.setAge(10);
School school = new School() {
@Override
public void goSchool() {
System.out.println("上常青藤小学");
}
};
anonymousMember.setSchool(school);

}
}


举报

相关推荐

0 条评论