内部类
-
什么是内部类: 定义在一个类的类体当中的类
-
作用: 共享数据的方式之一
-
分类
-
成员内部类
可以共享外部类所有的 属性和方法(病毒和人的关系)
创建方式: Outer.Inner in = new Outer.new Inner();
内部类中不允许有static修饰的内容,除非内部类有static修饰
public class OuterInner{
public static void main(String[] args){
Outer.Inner inner =new Outer().new Inner();
inner.show();
}
}
class Outer{
int i=1;
static int j=2;
class Inner{
public void show(){
System.out.println(i);
System.out.println(j);
}
}
}
/*
这样的写法是不可以的 Inner中的show()方法是无法访问到i的
class Outer{
int i=1;
}
calss Inner{
public void show(){
System.out.println(i);
}
}
*/
-
静态内部类
为了描述类和类的关系
只能共享外部类的 静态的属性和方法(房东和租客的关系)
创建方式:Outer.Inner in = new Outer.Inner();
public class OuterInner{ public static void main(String[] args){ Outer.Inner inner =new Outer.Inner(); inner.show(); } } class Outer{ int x=1; static int y=2; static class Inner{ int z=5; static int i=6; public void show(){ //System.out.println(x); 无法访问的x System.out.println(y); System.out.println(z); System.out.println(i); } } }
-
局部内部类
在外部类的方法体中,永远都不可以有static的声明
1)如果能够共享外部类的所有成员: 存在于非静态方法中
2) 如果能够共享外部类的静态成员: 存在于静态方法中
final修饰的局部变量 jdk8.0以后可以不加final(老师和学生的关系)
创建方式:Inner in = new Inner(); 内部类结束之后 所在的方法结束之前
public class OuterInner{ public static void main(String[] args){ Outer outer =new Outer(); outer.show(999); } } class Outer{ int a=1; //成员变量 static int b=2; //静态变量 public void show(int c){ int d=8; //局部变量 class Inner{ //局部内部类 int x=9; public void test(){ System.out.println(a); System.out.println(b); // c d 是final最终变量 无法修改 System.out.println(c); System.out.println(d); System.out.println(x); } }// 类结束之后 Inner inner = new Inner(); inner.test(); //方法结束之前 } }
-
匿名内部类
某些情况下,一个类的名字并不重要,使用一之后就不再使用
这个名字就显得很无用
创建方式:
new 父类/接口(){
};
匿名类可以共享的数据 取决于匿名内部类的位置 可能等价于上面三种形式
import java.util.*; public class OuterInner{ public static void main(String[] args){// 实现了Comparator接口的 无名的 类对象 Set<Integer> set =new TreeSet<>(new Comparator<Integer>(){ @Override public int compare(Integer x ,Integer y){ return y-x; //降序 } }); //Set<Integer> set =new TreeSet<>((x,y) -> y-x); jdk8.0lambda表达 //式 在部分场景下可以代替匿名内部类 Collections.addAll(set,5,3,4,1,2); System.out.println(set); } }
public class TestAnonyInner2{ public static void main(String[] args){ Student s1 = new Student(); s1.play(); Person james = new Person("james"){ @Override public void play(){ System.out.println("dunkdunkdunk!!!"); } }; james.play(); } } abstract class Person{ String name; public Person(String name){ this.name = name; } public abstract void play(); } class Student extends Person{ public Student(){ super("库里"); } @Override public void play(){ System.out.println("我是三分大神"); } }