Java之内部类

概念

内部类就是在一个类的内部定义一个类,比如,在A类中定义一个B类,那么对于A类来说,B类就是一个内部类,而对于B类来说,A类就是外部类。

一个java类中可以有多个类,但只有一个类是public修饰的,其余的类(也称为内部类)可以用来测试。

package BasicGrammar;

public class First {
     
    static String id = "11923020124";
}

class Second {
     
    public static void main(String[] args) {
     
        System.out.println(First.id);
    }
}

分类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

Outer.java
成员内部类最大的特点就是可以直接访问外部类的属性和方法。

package BasicGrammar;

public class Outer {
     
    private String id = "11923020124";

    public void out() {
     
        System.out.println("这是外部类的方法");
    }

    public class Inner {
     
        public void in() {
     
            System.out.println("这是内部类的方法");
        }

        public void getId() {
     
            out();
            System.out.println(id);
        }
    }
}

Test.java

package BasicGrammar;

public class Test {
     
    public static void main(String[] args) {
     
        Outer outer = new Outer();
        // 通过外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getId();
    }
}

运行结果:
Java之内部类_第1张图片

静态内部类

静态内部类就是给 成员内部类 加上static的修饰符。

静态内部类只可以访问外部类的静态属性和静态方法
Outer.java

package BasicGrammar;

public class Outer {
     
    private static String id = "11923020124";

    public static void out() {
     
        System.out.println("这是外部类的方法");
    }

    public static class Inner {
     
        public void in() {
     
            System.out.println("这是内部类的方法");
        }

        public void getId() {
     
            out();
            System.out.println(id);
        }
    }
}

局部内部类

定义在方法里面的类称为局部内部类。

定义在类中的接口,可以在接口中new出来,但这并不是接口的实例化,这只是一个假象。

package BasicGrammar;

public class Outer {
     
    public void method() {
     
        class Inner {
     
            public void in() {
     
                System.out.println("局部内部类");
            }
        }
    }
}

匿名内部类

没有(或者不需要)命名来初始化类,就称为匿名内部类。

package BasicGrammar;

public class Test {
     
    public static void main(String[] args) {
     
//        没有名字初始化类,不用讲实例保存到变量中.
        new Apple().eat();
        new UserService() {
     
            @Override
            public void sayHi() {
     
                System.out.println("sayHi.");
            }
        }.sayHi();
    }
}

class Apple {
     
    public void eat() {
     
        System.out.println("Eating Apple.");
    }
}

interface UserService {
     
    void sayHi();
}

运行结果:
Java之内部类_第2张图片

你可能感兴趣的:(Java,java,多态,编程语言)