概念
定义在一个类当中的类就是内部类,根据内部类位置和定义的不同,内部类分为了实例内部类,静态内部类,局部内部类,匿名内部类。内部类最大的作用就是解决java单继承的问题。
实例内部类
- 可以访问外部类所有成员包括private和静态成员。
- 访问外部类同名成员需要用:外部类名.this.成员名来指定访问。
- 定义在类之中,方法之外。
- 在没有外部类实例之前无法创建成员内部类对象。
//外部类
public class Main {
String name ="充气皮皮虾哦";
private int age = 100;
public static void main(String[] args) {
// 需要先实例化外类再去实例化内部类
Main.Son s = new Main(). new Son();
s.run();
}
//实例内部类
public class Son {
int age = 17;
String name ="123充气皮皮虾";
public void run (){
System.out.println(this.name);
System.out.println(Main.this.age);
};
}
}
静态内部类
- 被static修饰的类。
- 和静态成员相同,无法访问外部实例成员。
//外部类
public class Main {
static String name ="充气皮皮虾(外部)";
private static int num = 100;
public static void main(String[] args) {
Son s = new Son();
System.out.println(s.age);
// 外部类访问内部类
System.out.println(Son.name);
// 调用内部类方法
Son.run();
}
//静态内部类
static public class Son {
static String name ="充气皮皮虾(内部)";
int age = 18;
static void run (){
//访问外部类变量
System.out.println(num);
}
}
}
局部内部类
- 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
- .局部内部类不可使用权限修饰符 静态(static)修饰符进行修饰 同局部变量相同。
- .局部内部类 可以直接访问方法外部类中属性和方法。
- 局部内部类 创建对象 要在方法内部 局部内部类的外部声明。
//外部类
public class Main {
//外部类静态属性
static String name ="外部静态属性";
//外部类实例属性
String temp = "外部实例属性";
//方法
public static void run (){
String name = "方法内部属性";
System.out.println(name);
//局部内部类
class Inner{
// static String name = "局部内部类";
void get(){
System.out.println(name+"111");
test();
}
}
Inner s = new Inner();
s.get();
}
public static void test(){
System.out.println("外部类静态方法");
}
public void test2(){
System.out.println("外部类实例方法");
}
public static void main(String[] args) {
run();
}
}
匿名内部类
- 匿名内内部类必须要实现一个接口或者继承一个父类。
- 匿名内部类是直接使用new来生成一个对象的引用。
- 匿名内部类中不能存在任何成员和方法
- 匿名内部类没有构造函数。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
public class Main {
public void run () {
Account a = new Account(){
public String name ="充气皮皮虾";
void get (){
System.out.println(name);
}
};
a.get();
System.out.println(a);
}
}
public class Account {
public static void main(String[] args) {
}
void get(){};
}