内部类:在一个类的内部,再定义一个类。
eg:A类中定义一个B类,B类就是A类的内部类,A类就是B类的外部类。
分为:
-
成员内部类
-
静态内部类
-
局部内部类
-
匿名内部类
成员内部类
在类的内部写一个类,这个内部类可以访问其对应的外部类的私有和公有属性和方法。
创建内部类对象语法:
step1: 外部类名 obj1 = new 外部类名();
step2: 外部类名.内部类名 obj2 = obj1.new 内部类名();
package com.WZ.Demo.Application;
public class Application {
public static void main(String[] args) {
//创建内部类对象
//step1 外部类名 obj1 = new 外部类名();
Outer obj1 = new Outer();
//step2 外部类名.内部类名 obj2 = obj1.new 内部类名();
Outer.Inner obj2 = obj1.new Inner();
obj1.out();
obj2.in();
obj2.getID();
}
}
2、Outer类
package com.WZ.Demo.Application;
public class Outer {
private int id = 3;
public void out(){
System.out.println("这个是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这个是内部类的方法");
}
//测试是否能获得外部类的私有属性
public void getID(){
System.out.println("外部类的私有属性: "+id);
}
}
}
静态内部类
在刚刚成员内部类的基础上,public class Inner{ }上,加static关键字修饰。
与成员内部类的区别为:
-
内部类无法使用外部类的非静态成员。原因为:static加载时就有了,而外部类的非静态变量此时还不存在。
-
内部类依然可以使用外部类的静态成员。
局部内部类
在外部类的方法中,写的类,叫局部内部类。
package com.WZ.Demo.Application;
public class Outer {
public void method{
class Inner{
public void in(){}
}
}
}
匿名内部类
实例化对象的时候,不把名字赋值给变量,而是直接使用。语法为:new 类名.方法名();
1、main()
package com.WZ.Demo.Application;
public class Application {
public static void main(String[] args) {
new Person().show(); //匿名内部类
}
}
2、Person类
package com.WZ.Demo.Application;
public class Person {
public void show() {
System.out.println("匿名内部类");
}
}