什么是内部类
内部类是定义在其他类中的类。它只是一个编译时的概念,java编译器会将内部类和外部类编译为不同的的class文件。外部类:Outer.class,内部类:Outer$Inner.class
由于匿名内部类没有名字,则会被编译为Outer$+数字.class,如Outer$1.class。
一般的非内部类访问修饰符只能是default或者public,而内部类的修饰符可以是static,public,default,protected,private。
为什么要使用内部类
1、有些时候一类事物还会包含另一类事物,这时候定义内部类会让结构变得紧凑,同时也能更好的封装类。
2、java不支持多继承,内部类可以继承其他类,这样可以间接实现多继承。
内部类的几种形式
一、成员内部类
public class OuterClass {
private String name = "outer";
class InnerClass{
private String name = "inner";
void printName(){
System.out.println("外部名字:"+new OuterClass().name);
System.out.println("内部名字:"+name);
}
}
public InnerClass getInnerClass(){
InnerClass inner = new InnerClass();
return inner;
}
public static void main(String[] args) {
InnerClass inner = new OuterClass().getInnerClass();
inner.printName();
System.out.println("-------------------------");
InnerClass a= new OuterClass().new InnerClass();
a.printName();
}
}
public class TestClass {
public static void main(String[] args) {
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
inner.printName();
}
}
二、局部内部类
public class OuterClass {
private static String name = "outer";
private static void showName(final String name){
final String aaa = "aaa";
class InnerClass{
private String aname = "inner";
InnerClass(){
this.aname =this.aname +"&"+ name;
}
public void sss(){
System.out.println(aaa);
}
}
InnerClass inner= new InnerClass();
inner.sss();
}
public static void main(String[] args) {
showName(name);
}
}
三、静态内部类(嵌套内部类)
public class OuterClass {
public static class InnerClass{
private static String innerName = "inner";
public void printName(){
System.out.println(innerName);
}
}
public static void main(String[] args) {
InnerClass inner = new InnerClass();
inner.printName();
}
}
public class TestClass {
public static void main(String[] args) {
OuterClass.InnerClass inner = new OuterClass.InnerClass();
inner.printName();
}
}
四、匿名内部类
public class OuterClass { private static String outerName = "outer"; private static void showName(final String name){ String outerName = new InnerClass(){ String innerName = "inner"; @Override public String showName() { return innerName+"&"+name; } }.showName(); System.out.println(outerName); } public static void main(String[] args) { showName(outerName); } } abstract class InnerClass{ public String innerName; public abstract String showName(); }
几种内部类的作用及特点
一、成员内部类
1、成员内部类顾名思义就是内部类作为外部类的组成部分而存在,在外部类内部可以直接通过InnerClass来引用内部类对象,其他类则需要OuterClass.InnerClass来引用内部类对象。除了在外部类内部的非静态方法可以直接创建内部类如:new InnerClass()外,其他地方要获取成员内部类则必须是以 new OuterClass().new InnerClass(),也就是想要获取内部类对象,则必须先获取外部类对象;
2、成员内部类可以访问外部类的属性,包括私有属性;外部类想要访问内部类的成员变量或者方法则需要通过内部类对象来获取。
3、成员内部类中不能有static字段,也不能包含静态内部类
二、局部内部类
1、局部内部类是位于外部类的方法中的内部类。其作用范围就是其所在的方法或者代码块。
2、局部内部类和局部变量一样都不能用public、protected、private和static来修饰。
3、局部内部类要使用内部类之外的变量则需要用final来修饰。
三、静态内部类(嵌套类)
1、静态内部类是用static修饰的成员内部类。
2、之所以又叫嵌套类,说明静态内部类其实与外部类并没有太大的关系,只是借用外部类的地方。
3、静态内部类可以定义static属性和static方法。
4、静态内部类在其他类中创建方法为OuterClass.InnerClass inner = new OuterClass.InnerClass();
四、匿名内部类
1、有些类由于只需要使用一次,也就没必要为其命名。
2、可以通过new 类名/接口名()来创建匿名内部类。在创建匿名内部类的同时可以选择重写父类或接口中的方法。
3、当匿名内部类需要使用内部类之外的变量时,该变量需要被final修饰。