概述
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
成员内部类
定义在类中方法外的类。
格式
/*
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。
以计算机为例:计算机类Computer,其中包含Cpu类,Memmory类,Gui类等等
这些类可以定义在Computer中;
*/
class Outer{
class Inner{
}
}
访问特点
- 内部类可以直接访问外部类的成员,包括私有成员。
- 外部类要访问内部类的成员,必须要建立内部类的对象。
创建内部类对象格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
public class Person{
private boolean live = true;
class Heart{
public void jump(){
//直接访问外部类成员
if(live){
System.out.println("心脏在跳动!");
}else{
System.out.println("心脏不跳了!");
}
}
}
public boolean isLive(){
return live;
}
public void setLive(boolean live){
this.live = live;
}
}
public class InnerDemo(
public static void main(String[] args){
//创建外部类对象
Person p = new Person();
//创建内部类对象
Person.Heart heart = p.new Heart();
//调用内部类方法
heart.jump();
//调用外部类方法
p.setLive(false);
//调用内部类方法
heart.jump();
}
)
输出结果:
心脏在跳动
心脏不跳了
注意:内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名 和$符号 。
匿名内部类
匿名内部类 :是内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的 匿名的子类对象。开发中,常用到的内部类就是匿名内部类了。
前提
存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式
new 父类名或者接口名(){
//方法重写
@Override
public void method(){
//执行语句
}
}
使用方式
以接口为例
public interface FlyAble{
public abstract void fly();
}
匿名内部类可以通过多态的形式接受
public class Demo {
public static void main(String[] args) {
/*
1.等号右边:定义并创建该接口的子类对象
2.等号左边:是多态,接口类型引用指向子类对象
*/
FlyAble f = new FlyAble() {
@Override
public void fly() {
System.out.println("fly");
}
};
f.fly();
}
}
匿名内部类直接调用方法
public class Demo {
public static void main(String[] args) {
/*
1.等号右边:定义并创建该接口的子类对象
2.等号左边:是多态,接口类型引用指向子类对象
*/
new FlyAble() {
@Override
public void fly() {
System.out.println("fly");
}
}.fly();
}
}
方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递
public class Demo2 {
public static void main(String[] args) {
FlyAble f = new FlyAble() {
@Override
public void fly() {
System.out.println("fly");
}
};
show(f);
}
private static void show(FlyAble f) {
f.fly();
}
}
//简化:
public class Demo {
public static void main(String[] args) {
show(new FlyAble() {
@Override
public void fly() {
System.out.println("fly");
}
});
}
private static void show(FlyAble f) {
f.fly();
}
}
//简化2:
public class Demo {
public static void main(String[] args) {
show(new FlyAble() {
@Override
public void fly() {
System.out.println("fly");
}
});
}
private static void show(FlyAble f) {
f.fly();
}
}