/*
* 类的内部成员之五:内部类
* 1. Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
*
* 2.内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
*
* 3.成员内部类:
* 一方面,作为外部类的成员:
* >调用外部类的结构
* >可以被static修饰
* >可以被4种不同的权限修饰
*
* 另一方面,作为一个类:
* > 类内可以定义属性、方法、构造器等
* > 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
* > 可以被abstract修饰
*
*
* 4.关注如下的3个问题
* 4.1 如何实例化成员内部类的对象
* 4.2 如何在成员内部类中区分调用外部类的结构
* 4.3 开发中局部内部类的使用
*
*/
public class InnerClass {
public static void main(String[] args) {
//4.1 如何实例化成员内部类的对象
//1、普通类的实例化,需要外部类的实例
A a = new A();
A.B1 b1= a.new B1(); //记忆:通过对象去dot
//A.B1 b1 = new A.B1();//不能成功调用
//2. 静态内部类化
A.B2 b2= new A.B2();
b1.doSomething('q');
}
}
class A{
class B1{//这就叫内部类
char B = '1';
public void InnerMethod () {
System.out.println("Inner!");
}
//4.2 如何在成员内部类中区分调用外部类的结构
public void doSomething(char c) {
System.out.println(c);
System.out.println(this.B);//1
System.out.println(B);//1
System.out.println(A.B1.this.B);
//求指点
//System.out.println(A.B2.this.B); //No enclosing instance of the type
//System.out.println(A.B3.this.B); //No enclosing instance of the type
}
}
static class B2{//静态内部类
char B = '2' ;
public void InnerStaticMethod() {
System.out.println("InnerStatic!");
}
}
class B3{
int B = 10;
}
public void OuterMethod() {
System.out.println("Outer!");
class C{//方法中的内部类(局部内部类)(极其少见)
//4.3 开发中局部内部类的使用
//返回一个实现了Comparable接口的类的对象
public Comparable getComparable(){
//创建一个实现了Comparable接口的类:局部内部类
//方式一:
// 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;
}
};
}
}
}
}