java中我们把一个类放在另一个类内部定义,我们称这样的类为内部类。
内部类分为成员内部类、局部内部类和匿名内部类。成员内部类包含静态内部类和非静态内部类。局部内部类定义在方法中,像是一局部变量。匿名内部类主要是接口和抽象类的继承类实例化(一般类继承也是可以的,注意匿名代表没有名字!!!)。以下是两种内部类的代码解析。
成员内部类:1静态内部类,静态内部类就像是类中的静态成员变量,其引用实例化可以直接类名.内部类类名()。
public class Outer{
String property1 =“学生”;
static String property2="老师";
static class Inner {
public void run(){
System.out.println(" I am a "+property);
}
}
}
public class Test {
public static void mian (String[] args){
Outer.Inner inner =new Outer.Inner();
inner.run();
}
}
注意静态内部类只能使用外部类的静态属性,非静态内部类从属于对象,创建了静态内部类对象不一定创建了外部类对象所以无法使用非静态外部类的属性。编译器找不到非静态内部类的属性地址。
2非静态内部类:非静态内部类如同非静态成员变量,所以从属于外部类对象中。故创建非静态内部类对象需要外部类的对象存在,使用外部类对象创建内部类对象。
public class Outer{
String property="学生";
class Inner {
String property ="老师";
public void prin(){
System.out.printlc(property);
}
}
}
public class Test{
public static void main (String[] args){
Inner inner=new Outer().new Inner();
Outer out =new Outer();
Inner inner2=outer.new Inner();
inner.prin();
inner2.prin();
}
}
最后输出为老师,老师。由于非静态内部类就如非静态内部成员变量存在于外部类的对象中,所以一定要用外部类的对象创建内部类的对象,同时内部类可以直接引用外部类的成员变量以及静态方法(如果内部类具有相同名字的属性则首先用内部类的属性)但是外部类不可以访问内部类的属性。
局部内部类:局部内部类出现于方法中
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
匿名内部类:匿名内部类就如其名,内部类的名字是匿名的不可见的。主要用于接口和抽象类被继承的子类创建对象。以接口为例
public interface listener {
String name ="ssss";
public void run();
}
public class Stutent {
private String name;
private int id;
private int age;
public Stutent(listener listener) {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study() {
System.out.println("I am learning");
}
public void sayHello(){
System.out.println("HelloWord!!");
}
}
public class Test{
public static void main(String[] args){
Stutent stutent=new Stutent(new listener() {
@Override
public void run() {
}
}
}
其中new student的时候我们创建了内部类继承接口listener因为listener不能直接实例化,并且在内部类中重写抽象方法。类名且不可见。然后创建对象。(在抽象类中非抽象方法可重写也可不重写)。