内部类
- 内部类就是在一个类的内部定义一个类,比如:A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是一个外部类了。
-
成员内部类
可以获得外部类的私有属性和私有方法。
代码示例:
package cheng.oop.demo09;
// 外部类
public class Outer {
private int id = 10;
public void out() {
System.out.println("这是外部类的方法!");
}
// 内部类
public class Inner {
public void in() {
System.out.println("这是内部类的方法!");
}
// 可以获得外部类的私有属性,私有方法
public void getID() {
System.out.println(id);
out();
}
}
}
调用:
package cheng.oop;
import cheng.oop.demo09.Outer;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
// 通过这个外部类来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();
}
}
-
静态内部类
无法获得外部类的私有属性和私有方法,因为它是在类被创建时就已经创建(在外部类的私有属性和私有方法之前),如果将外部类的私有属性和私有方法也改为静态属性和静态方法,则可以获得。
代码示例:
package cheng.oop.demo09;
public class Outer {
private int id = 10;
public void out() {
System.out.println("这是外部类的方法!");
}
public static class Inner {
public void in() {
System.out.println("这是内部类的方法!");
}
}
}
- 局部内部类
代码示例:
package cheng.oop.demo09;
// 类
public class Outer {
// 方法
public void method() {
// 局部内部类
class Inner {
// 依旧可以定义方法
public void in() {
}
}
}
}
-
匿名内部类
没有名字初始化类,不用将实例保存到变量中。
代码示例:
package cheng.oop.demo09;
public class Test {
public static void main(String[] args) {
// 没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
// 接口同样可以匿名
new UserService() {
@Override
public void test() {
// 实现接口的类
}
};
}
}
// 类
class Apple {
public void eat() {
System.out.println("吃");
}
}
// 接口
interface UserService {
void test();
}
拓展:
一个Java类中可以有多个class类,但是只能有一个public class
代码示例:
package cheng.oop.demo09;
public class Outer {
}
// 一个Java类中可以有多个class类,但是只能有一个public class
class A {
public static void main(String[] args) {
}
}