内部类:
1. 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
2. 外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问
3. 内部类如果定义成静态的,在内部类中就只能访问外部类的静态成员
- 成员内部类(类中的类)
package com.cwt.成员内部类;
public class People {
String name = "People";
public void say() {
System.out.println("我是" + name);
}
// 写一个Student内部类
public class Student {
String name = "Student";
public void say() {
System.out.println("我是" + name+"年龄:" + age);
}
}
}
//测试类
package com.cwt.成员内部类;
import com.cwt.成员内部类.People.Student;
public class Test {
public static void main(String[] args) {
People people = new People();
people.say();
// Student student = new Student();
//上面一句经过测试报错了,因为Student也是People的成员必须要用People 的对象去引用
Student student = people.new Student();
student.say();
}
}
- 总结:
- 成员内部类,从上面代码可以看出,Student虽然是一个类,但他也属于People的一个成员,这样也可以解释那一句为什么报错了,因为Student类也属于People的一个成员,所以要用People的对象去访问,即 Student student = people.new Student();
- 内部类中可以访问外部类的属性,如果内部类是静态的,那只能 访问外部类的静态成员
- 方法内部类
package com.cwt.方法内部类;
public class Outer {
public String name = "方法内部类";
public void test() {
// 下面是方法中定义的一个类
// 不能用public 修饰,只能用默认的访问权限
class Inner {
public void show() {
System.out.println("我是:" + name);
}
}
Inner inner = new Inner();
inner.show();
}
}
//测试类
package com.cwt.方法内部类;
public class Test {
public static void main(String[] args) {
// 问题:方法内部类怎么创建对象
// 先创建一个外部类对象
Outer outer = new Outer();
// outer.show();外部类对象无法访问方法内部类的方法
outer.test();// 访问方法内部类
}
}
- 匿名内部类:没有名字的内部类,可以简化代码,但是只能使用一次,下面我将对比一下,怎么简化代码的
//先写一个抽象People抽象类
package com.cwt.匿名内部类;
public abstract class People {
String name = "People类";
public abstract void say();
}
//实现Pelple类的方,第一种方式,继承People类
package com.cwt.匿名内部类;
public class Student extends People {
public Student() {
say();
}
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("我是继承实现了People的抽象方法");
}
}
//第二种方式,使用匿名内部类实现People
package com.cwt.匿名内部类;
public class Student {
public Student() {
new People() {
// 在这儿使用匿名内部类
@Override
public void say() {
System.out.println("我是匿名内部类");
}
};
}
}