首先说一下,本节东西都是些奇葩东西,不符合规范的,但是还是要知道,以防以后不会看别人的奇葩代码。
什么是内部类、外部类
- 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
1. 成员内部类
public class Outer {
private int id = 123 ;
public void test(){
System.out.println("外部类的方法。");
}
public class Inner {
public void test2(){
System.out.println("这是内部类。");
}
}
}
public class Application {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();//必须通过外部类实例化的对象来new出内部类的实例
in.test2();
}
}
- 作用
- 内部类可以直接访问外部类的私有属性、方法
public class Outer {
private int id = 123;
private void test(){
System.out.println("外部类的方法。");
}
public class Inner {
public void test2(){
System.out.println("这是内部类。");
}
public void printOuterId(){
System.out.println(id);
}
public void useOuterTest(){
test();
}
}
}
public class Application {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.printOuterId();//输出外部类的私有属性
in.useOuterTest();//使用外部类的私有方法
}
}
2. 静态内部类
也就是在内部类前面加个static关键字,详细自己出查。或者以后补充。
3. 匿名内部类
public class Application {
public static void main(String[] args) {
/*
正常情况我们实例化类都会用一个变量其保存
*/
Cat xiaohei = new Cat();
xiaohei.eat();
/*
我们也可以不用变量去保存,成为匿名
*/
new Cat().eat();
/*
接口可以匿名new出来,真TM神奇,不过也必须重写接口的方法。
其实就是不知道哪个类去实现了这个接口,所以称为“匿名”
*/
new userService(){
@Override
public void add(String name) {}
};
/*
甚至接口可以用变量存储起来
*/
UserService admin = new UserService(){
@Override
public void add(String name) {}
};
}
}
class Cat{
public void eat(){
System.out.println("吃饱了。");
}
}
interface userService{
void add(String name);
}
5. 局部内部类
在方法里面定义的
public class Application {
public void getId(){
class Cat{
}
}
}
6.
一个java类中可以有多个class类,但是只能有一个public class类,当然,也可以写接口。
public class Application {
}
class A {
public static void main(String[] args) {
}
}
interface B {
void add(String name);
}