内部类
class A{
//这是外部类
class B{
//这是内部类
}
}
1.内部类的优点
- 内部类与外部类可以方便的访问彼此的私有域(包含私有方法、私有属性)
- 内部类是另外一种封装(保护性),对外部的其他类隐藏不可见,比如:心脏在人身体内
- 内部内部类可以实现Java单继承的局限
2.内部类的缺点
3.创建内部类的语法
创建非静态内部类对象
- 外部类.内部类 类名 = new 外部类().new 内部类();
Outter.Inner in = new Outter().new Inner();
创建静态内部类对象
- 外部类.内部类 类名 = new 外部类().内部类();
Outter.Inner in = new Outter.Inner();
内部类的分类
一、成员内部类
- 可以把它理解为外部类的一个成员方法
- 非静态内部类不能存在static的变量和方法,因为在外部类加载的时候,内部类不会加载。static变量是类加载的时候就创建的。
- 成员内部类是依附于外部类的,所以只有先创建了外部类才能创建内部类
class Outter{
private String name = "test";
private static int age = 20;
clss Inner{
//private static int age = 50 错误静态变量不能在内部类中声明
public void fun(){
System.out.println(name);
System.out.println(age);
}
}
}
public class Test{
public void mian
}
二、静态内部类
- 静态内部类也可以类比静态方法
- 静态内部类不依赖于外部类的对象的创建,可以直接创建。
- 静态内部类不能访问外部类的非静态成员,但是可以自己创建静态成员
- 静态内部类是独立的,只是在别的类内部罢了
class waibu{
//静态内部类
static int y = 10;
private int x = 20;
public static void fun2(){
System.out.println("qwe");
}
static class neibu{
static int p = 30;
public void fun(){
System.out.println("asd");
System.out.println(y);
}
}
}
三、方法内部类
- 定义在方法之中的类
- 只能被此方法所见,其他地方均不可见
- 由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
- 方法内部类如果要想使用形参(本方法的形参),该形参必须使用final声明(JDK8将形参变为隐式final声明)
class waibu{
//方法内部类
static int y = 10;
private int x = 20;
public static void fun2(int k){
System.out.println("qwe");
class neibu{
int p = 30;
public void fun(){
System.out.println("asd");
System.out.println(y);
k = 80;
System.out.println(k);
}
}
new neibu().fun();
}
}
四、匿名内部类
- 匿名内部类就是一个没有名字的方法内部类。因此特点与方法内部类完全一样,
- 除此之外还有两个自己的特点:
- 1.匿名内部类必须继承一个抽象类或者实现一个接口
- 2.匿名内部类没有构造方法,因为它没有类名
`interface jiekou{
void fun3();
}
class waibu{ //匿名内部类
static int y = 10;
private int x = 20;
public static jiekou fun2(int k){
System.out.println("qwe");
return new jiekou(){
int p = 30;
public void fun(){
System.out.println("asd");
System.out.println(y);
System.out.println(k);
}
public void fun3(){
System.out.println("匿名");
}
};
}
}