文章目录
- 1.什么是内部类?
- 2.类中定义的内部类特点
- 3.内部类的分类
1.什么是内部类?
将一个类定义在另一个类的内部,该类就称为内部类
public class Outer{//外部类
class Inner{//内部类
}
}
2.类中定义的内部类特点
- 内部类作为外部类的成员,可以直接访问外部类的成员(包括 private 成员),反之则不行。
- 内部类做为外部类成员,可声明为 private、默认、protected或 public。
- 内部类成员只有在内部类的范围之内是有效的。
- 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的 private 还要小的访问权限。
内部类的优缺点:
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构
public class Face {
private String shape="脸";//私有属性
public class Nose{
public void breath(){
//当内部类与外部类有相同的属性时,在访问外部类的属性时,需要加上外部类的类名
System.out.println("鼻子长在了"+Face.this.shape+"上");
}
}
}
public class Test {
public static void main(String[] args) {
Face f=new Face();//创建对象
Face.Nose n=f.new Nose();
n.breath();//调用方法
}
}
效果图:
3.内部类的分类
- 成员内部类
内部类相当于外部类的成员(前面的例子就是成员内部类) - 静态内部类
不允许访问外部类的非static属性
如果内部类的方法为static方法,那么内部类也必须为静态的
public class Outer {
private static String name="李四";
static class Inner{
public void show(){
System.out.println(name);
}
public static void show2(){
System.out.println(name+"1111");
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner i=new Outer.Inner();
i.show();//调用非静态方法
Outer.Inner.show2();//调用静态方法
}
}
效果图:
- 方法中的内部类
只能在方法中使用,相当于方法中的局部变量
JDK1.8 新特性
A. JDK1.8 之前方法中的内部类要访问外部类的局部变量,必须加上 final 关键字 (常量)
B. JDK1.8 开始,在访问外部类的局部变量时,则可以不加 final 关键字
public class Outer {
public void show(){
int a=10;
class Inner{
public void fun(){
System.out.println(a);
}
}
new Inner().fun();
}
}
public class Test {
public static void main(String[] args) {
Outer i=new Outer();
i.show();
}
}
效果图:
- 匿名内部类 (存在继承或实现关系)
A. 可以实现一个接口,或者继承一个父类
B. 只能实现一个接口
C. 适合创建那种只需要一次使用的类,不能重复使用。比较常见的是在图形界面编程 GUI 里用得到。
public abstract class Father {
public abstract void dream();
}
public class Test {
public static void main(String[] args) {
Father f=new Father() {//匿名内部类(没有名字的子类)
@Override
public void dream() {
System.out.println("OK");
}
};
f.dream();
}
}