java
容许将一个类A
声明在另外一个类B
中,则类A
就是内部类,类B
称为外部类java
内部类的分类:成员内部类(静态内、非静态内) VS
局部内部类(方法内、代码块内、构造器内)
外部类的成员:
1)调用外部类的机构。
2)能够用被static
修饰。
3)能够被四种不一样的权限修饰。ide
做为一个类:
1)类内能够定义属性、方法、构造器等。
2)能够被final
修饰,表示此类不能被继承。言外之意,不使用final
就能够被继承。
3)能够被abstract
修饰,表示此类不能被实例化。与上面同理,不使用abstract
就能被实例化。this
关注以下三个问题:
1)如何实例化成员内部类的对象。
2)如何在成员内部类中区分调用外部类的结构。code
public class InnerClassTest { public static void main(String[] args) { // 建立Dog实例(静态的成员内部你) Person.Dog dog = new Person.Dog(); dog.show(); // 建立Bird实例(非静态的成员内部类) Person person = new Person(); Person.Bird bird = person.new Bird(); bird.sing(); System.out.println(); bird.display("黄鹂"); } } class Person{ String name = "库森"; int age; public void ead() { System.out.println("人:吃饭"); } //静态成员内部类 static class Dog { String name; public Dog() {} public void show() { System.out.println("卡拉沙狗"); } } //非静态成员内部类 class Bird{ String name = "杜鹃"; public Bird() {} public void sing() { System.out.println("我是一只小小鸟"); //调用外部类的一个方法 Person.this.ead(); } public void display(String name) { System.out.println(name);//方法形参 System.out.println(this.name);//内部类的name System.out.println(Person.this.name);//外部类的name System.out.println(age);//在没有重名的状况下能够直接调用外部类的成员属性 } } public Person() { class CC {}//局部内部类 } public void method() { class AA {}//局部内部类 } { class BB {}//局部内部类 } //修饰内部类 abstract class Cat{} final class Snake{} }
3)开发中局部内部类的使用。对象
public class InnerClassTest1 { public Comparable getComparable() { // 方式一: class MyComparable implements Comparable { @Override public int compareTo(Object o) { return 0; } } return new MyComparable(); // 方式二: return new Comparable() { @Override public int compareTo(Object o) { return 0; } }; } }