内部类
内部类是写在类里面的类,在一个类中,还可以定义多个类,内部类可以直接直接获取外部类中的所有属性和方法,就算是私有属性也可以获得。如果说继承像父亲和儿子,那外部类和内部类的关系就像丈夫和妻子,只不过这里是一夫多妻制。内部类像妻子,可以直接使用外部内中所有东西。但内部类不是个称职的妻子,外部内不能使用内部类中的属性和方法。(除了类中的类,还有写在方法中的类,叫做局部内部类。但不推荐使用。)
内部类就是在一个类中再定义一个类,这个类可以直接使用外部类中的所有方法和属性,但如果内部类被static修饰的,会比外部类更早生成,这样就不能使用外部类的东西了。在调用内部类时,需要先初始化外部类,再用外部类来调用内部类。
调用方法,先实例化外部类后:
外部类 . 内部类 对象 = 外部类 . new 内部类();
创建内部类
package oop.Demo08;
//外部类
public class Outer {
private int ID = 5;
public void go (){
System.out.println("外部类");
}
//内部类
public class Inner{
public void in (){
System.out.println("内部类");
}
public void gatID(){
System.out.println(ID);//可以直接获取到外部类的私有属性
}
}
}
测试类
package oop;
import oop.Demo08.Outer;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();//实例化外部类
Outer.Inner inner = outer.new Inner();//通过外部类再实例化内部类
outer.go();//输出外部类的方法
inner.in();//输出内部类的方法
inner.gatID();//输出内部类获取到外部类的私有属性的方法
}
}
多种不同的内部类
1. 内部类还可以写在一个类的外面,不被外部内所包含,相当于一个类的界面出现两个类。由于class可以定义无数个,但public class只能定义一个,所以没有public的类就被当做内部类,这种类不能直接调用外部内的私有属性和方法。但可以正常的使用main方法,一般作为测试类使用。
package oop.Demo08;
//外部类
public class Outer {
private int ID = 5;
public void go (){
System.out.println("外部类");
}
}//外部内的大括号截止到这里
//写在外面的内部类
class Cc{
public static void main(String[] args) {
}
}
2. 写在方法中的变量,叫局部变量。所以,写在方法中的内部类,叫做局部内部类。局部内部类中还可以在定义方法和内部类。
package oop.Demo08;
//外部类
public class Outer {
private int ID = 5;
public void go (){
System.out.println("外部类");
}
//内部类
public class Inner{
public void in (){//内部类中的方法
class Aaa{//在方法中再创建内部类
public void aaa(){//再在这个内部类中创建方法
class Aaa2{//再来一个内部类
public void aaa2(){//然后再来一个方法
System.out.println(ID);//输出外部类的私有属性
}
}
}
}
System.out.println("内部类");
}
public void gatID(){
System.out.println(ID);//可以直接获取到外部类的私有属性
}
}
}
可以看出,在方法中无论定义多少个局部内部类和方法,都可以照常输出外部内的私有属性和私有方法。
3. 匿名内部类:一个不需要名字的类,在实例化的时候,不使用 (对象类型 对象名 = new 类名())的方式,可以直接(new 类名().【需要调用的类成员】())方式直接调用。这样的形式就是创建了一个匿名内部类。
package oop;
public class Application {//测试类
public static void main(String[] args) {
new A().a();//通过该方法创建了一个匿名内部类
}
}
class A{//创建一个类(不一定必须创建内部类)
public void a(){
System.out.println("匿名内部类");
}
}