一 内部类
类中嵌套类叫内部类,包含内部类的类叫外部类;
内部类使用static 修饰叫静态内部类外部类可以使用内部类;
外部类中静态函数不能使用new创建内部类的对象(只能创建引用类型变量),创建静态内部类对象例外;
内部类可以任意方式使用外部类;
内部类可以使用任何访问权限修饰符修饰;
内部类的访问权限对外部类没有任何约束;
内部类可以使用其它类
其它类使用内部类时受内部类的访问权限修饰符约束,约束规则与外部类的成员一样;
其它类可以创建内部类的引用类型变量,但是只能创建静态内部类的对象;
示例:
//Hello叫外部类、Stu叫内部类
public class Hello {
public void m() {
Stu stu = new Stu();
stu.study();
}
public static void main(String[] args) {
new Hello().m();
}
class Stu {
public void study() {
System.out.println("Stu study()....");
}
}
}
二 匿名内部类
(1)匿名内部类是在一个类中写一个没有名子的子类,或没有名字的接口实现类,并且直接创建了对象;
(2)匿名内部类的父类可以是普通类;
示例:
public class Stu {
public void study() {
System.out.println("good good study");
}
public void sleep() {
System.out.println("sleep");
}
}
public class Hello {
public Stu stu = new Stu() {
};
public static void main(String[] args) {
Hello h = new Hello();
h.stu.study();
h.stu.sleep();
}
}
public class Hello2 {
public Stu stu = new Stu() {
@Override
public void study() {
System.out.println("好好学习");
}
};
public static void main(String[] args) {
Hello2 h = new Hello2();
h.stu.study();
h.stu.sleep();
}
}
(3)匿名内部类的父类可以是抽象类
public abstract class Stu {
public void study() {
System.out.println("good good study");
}
public void sleep() {
System.out.println("sleep");
}
public abstract void go();
}
public class Hello {
public Stu stu = new Stu() {
@Override
public void study() {
System.out.println("好好学习");
}
@Override
public void go() {
System.out.println("走....");
}
};
public static void main(String[] args) {
Hello h = new Hello();
h.stu.study();
h.stu.sleep();
h.stu.go();
}
}
(4)匿名类部类是接口的实现类
public interface Inf {
public abstract void go();
}
public class Hello {
public Inf inf = new Inf() {
@Override
public void go() {
System.out.println("go");
this.xx();
}
public void xx() {
System.out.println("xx");
}
};
public static void main(String[] args) {
Hello h = new Hello();
h.inf.go();
//h.inf.xx();//错
}
}
(5)前面匿名内部类对象都是为外部类的成员变量赋值,实际上匿名内部类对象也可以为外部类函数中的局部变量赋值
public interface Inf {
public abstract void go();
}
public class Hello {
private void test() {
Inf inf = new Inf() {
@Override
public void go() {
System.out.println("go()...");
}
};
}
}
三 内部类中访问外部类对象
内部类函数中的this表示内部类对象,要得到外部类对象可使用"外部类名.this",所以访问外部类对象成员格式为:
"外部类名.this.外部类成员"
public interface Inf
{
public abstract void go();
}
public class Hello {
public int x = 100;
public void m1() {
System.out.println("m1....");
}
private void test() {
Inf inf = new Inf() {
public int x = 20;
@Override
public void go() {
System.out.println("go()...");
Hello.this.m1();
m1();
System.out.println(Hello.this.x);//100
System.out.println(Hello.this.x);//20
}
};
}
}