内部类
写在一个类里面的类叫做内部类
内部类的分类
成员内部类/静态内部类/局部内部类/匿名内部类
成员内部类
写在成员位置的,属于外部类的成员。
成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等。
在成员内部类中,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
public class Outer {
String name;
Private class Inner{
}
//因为Inner用private修饰,故需要提供给其他类创建对象的方法,用getInstance获取Inner对象给使用者
public Inner getInstance(){
return new Inner();
}
}
public class test{
public static void main(String Args[]){
Outer o = new Outer();
/*由于private修饰,所以不能使用Inner.oi去获取getInstance返回的对象,可以使用其父类object(超类)来接收*/
object oi = o.getInstance();//$符号供内部类使用
System.out.println(oi);//Outer$Inner@4eec7777
//outer.Inner oi = new OUter().new Inner();
//System.out.println(Outer.this.变量名);
}
}
/内部类的堆内存中会自动生成一个“父类名.this”去记录外部类的地址/
静态内部类
静态内部类是一种特殊的成员内部类。
静态内部类只能访问外部类中的静态变量和静态方法,如果想访问非静态的需要创建外部类的对象。
创建静态内部类对象的格式:外部类名 对象名=new 外部类名.内部类名();
//new出来的对象是Inner的对象
Outer.Inner oi = new Outer.Inner();
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类.方法名();
局部内部类
将内部类定义在方法里面就叫做局部内部类,类似与方法里面的局部变量。局部内部类和局部变量一样,都不能使用public,static,protected等修饰符修饰
外界是无法直接使用,需要在方法内创建局部内部类的对象并使用。
该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
pubolic class Outer{
public void show(){
int a = 10;
}
//局部内部类
class Inner{
String name;
int age;
public void method1(){
System.out.println("局部内部类中的method1方法");
}
public static void method2(){
System.out.println("局部内部类中的method2静态方法");
}
}
//创建局部内部类的对象
Inner i = new Inner();
System.out.println(i.name);
System.out.println(i.age);
i.method1();
Inner.method2();
}
匿名内部类(常用且重要)
匿名内部类本质上就是隐藏了名字的内部类(继承/实现、方法重写、创建对象)
example:
//new 类名或者接口名
new Inner() {
//需要重写方法
public void show() {
}
};//注意大括号末尾有一个分号
匿名内部类可以写在成员位置,也可以写在局部位置
匿名内部类格式的细节:1,包含了继承或实现,方法重写,创建对象。2,整体就是一个类的子类对象或者接口的实现类对象。
使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。
很牛逼QAQ
// Today is not easy, tomorrow is more difficult, but the day after tomorrow will be wonderful.
标签:Outer,内部,对象,Inner,new,public From: https://www.cnblogs.com/tenset/p/17778213.html