内部类
将一个类定义在另一个类的内部(也是是在方法中,包括静态方法),这个类就叫做内部类。另一个类也可以是接口,也就是说内部类也可以存在接口中。
public class OutClass {
private Integer a;
class Inner {
}
}
普通内部类
内部类的定义非常简单,就像上面的Inner,当然,内部类也具有自己的访问权限。那我们如何创建一个内部类对象呢?在外部类的非静态方法之外的任意位置创建(外部类的静态方法内,和其他类任意位置),必须向下面main方法一样
public static void main(String[] args) {
OutClass out=new OutClass();
Inner in= out.new Inner();
}
out.new ,需要一个外部内的引用out。我们也可以在外部类的方法中返回内部类对象,这样就可以调用方法直接得到一个内部类对象。
内部类,可以任意访问外部类的所有元素,即使外部类的元素是私有的。可以通过外部类.this来获取外部类对象。普通内部类不能拥有静态资源,除非是静态内部类。
public class OutClass {
private Integer a;
class Inner {
int b=OutClass.this.a;
}
}
静态内部类
可以将内部类定义成static,这样的内部类叫做嵌套类。
创建一个嵌套类对象,不再需要外部内的引用,可直接创建。
public class OutClass {
private Integer a;
static class Inner {
}
public static void main(String[] args) {
Inner in= new Inner();
}
}
嵌套不能再通过 外部类.this获得外部类对象。
匿名内部类
public class OutClass {
private Integer a;
class Inner {
}
public static Animal info(){
return new Animal(){
String name="猫";
public void show(){
System.out.println("我是"+name+"今年"+age);//我是猫今年18
}
};
}
public static void main(String[] args) {
OutClass.info().show();
}
}
---------------------------------------------------------------
interface Animal {
int age=18;
void show();
}
匿名内部类是创建继承其他类或者接口的匿名类对象,怎么理解这句话呢?我们看上面的info方法,返回一个Aniaml对象。实际返回的是new Aniaml(){},这个{}里面可以写方法和属性,这其实是Animal的子类,向上转型再返回。因为没有名字所以叫做匿名类,同时你也不能给它加构造方法,只能靠构造块。
public abstract class Animal {
public Animal(int a,int b){}
int age=18;
abstract void show();
}
如果你继承的类拥有含参数的构造方法,那这个匿名类对象也必须通过这个构造方法初始化,那应该怎么操作呢?
public static Animal info(int a,int b){
return new Animal(a,b){
String name="猫";
public void show(){
System.out.println("我是"+name+"今年"+age);
}
};
}
Animal(a,b)。参数的来源可以是info方法的局部变量,也可以是它本身的参数,也可以是外部类的属性。在匿名类的{}中,你不一定要通过 Animal(a,b)这样传参才能使用外部的参数、属性、局部变量。你可以直接使用,这里只是因为继承的类有有参构造。
你在匿名类中使用了前面所说的变量,那些变量必须是final的,旧版本你必须显示申明,高版本默认是final。前面所说的外部类的属性例外,我测试的一下,我使用了这样的属性,但是外部类的那个属性不用赋初值,可以证明它不是final。但是在匿名内部类中你不能改变他的值或者指向新的对象。
局部内部类
局部内部类是声明在方法中的,但和匿名内部类是有差别的。
public class OutClass {
public OutClass() {
}
public void info(){
class Inner {
}
}
}
局部内部类相当于这个方法的变量,所以这能用final修饰,同时作为一个类,你可以使用abstract。
每个类都可以独立去继承一个类,而内部类可以访问外部类所有元素。从某种程度来说,可以通过内部类实现“多继承“。