文章目录

  • 1.什么是内部类?
  • 2.类中定义的内部类特点
  • 3.内部类的分类


1.什么是内部类?

将一个类定义在另一个类的内部,该类就称为内部类

public class Outer{//外部类
	class Inner{//内部类
	}
}

2.类中定义的内部类特点

  1. 内部类作为外部类的成员,可以直接访问外部类的成员(包括 private 成员),反之则不行。
  2. 内部类做为外部类成员,可声明为 private、默认、protected或 public。
  3. 内部类成员只有在内部类的范围之内是有效的。
  4. 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的 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();//调用方法
    }
}

效果图:

java 内部类 应用 java使用内部类的优缺点_java 内部类 应用

3.内部类的分类

  1. 成员内部类
    内部类相当于外部类的成员(前面的例子就是成员内部类)
  2. 静态内部类
    不允许访问外部类的非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();//调用静态方法
    }
}

效果图:

java 内部类 应用 java使用内部类的优缺点_面向对象编程_02

  1. 方法中的内部类
    只能在方法中使用,相当于方法中的局部变量
    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();
    }
}

效果图:

java 内部类 应用 java使用内部类的优缺点_java_03

  1. 匿名内部类 (存在继承或实现关系)
    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();
    }
}