一.成员内部类
实验1:成员内部类
class Outer {
private int a = 10;
class Inner {
public void printInfo(){
System.out.println("a = "+a);
}
}
}
public class InnerDemo {
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner i = o.new Inner();
i.printInfo();
}
}
运行:
root@ubuntu:/home/topeet/guyilian# javac InnerDemo.java
root@ubuntu:/home/topeet/guyilian# java InnerDemo
a = 10
特点如下:
1.内部类可以直接访问外部类的所有成员(成员变量和成员方法),包括private和static所修饰的。但是外部类不能直接访问内部类成员,需要通过预先创建的内部类对象去访问。
2.成员内部类可以使用权限修饰符(private、default、protected、public)任意进行修饰。
3.成员内部类是默认包含了一个指向外部类对象的引用。要创建成员内部类对象,必须先创建一个外部类对象。
二.静态内部类
实验2:静态内部类
使用static修饰的成员内部类我们称之为静态内部类。
class Outer {
private static int a = 10; //静态内部类访问的变量也要用static修饰
static class Inner { //静态内部类要用static修饰
public void printInfo(){
System.out.println("a = "+a);
}
}
}
public class InnerDemo {
public static void main(String args[]) {
//Outer o = new Outer();
//Outer.Inner i = o.new Inner();
Outer.Inner i = new Outer.Inner();
i.printInfo();
}
}
运行:
root@ubuntu:/home/topeet/guyilian# javac InnerDemo.java
root@ubuntu:/home/topeet/guyilian# java InnerDemo
a = 10
特点如下:
1.静态内部类可以访问外部类的静态成员,不能访问非静态成员,内部类还可以定义静态成员。
2.静态内部类是4种类中唯一一个不依赖于外部类对象的引用的内部类,静态内部类可以被其他类直接访问和实例化,不需要先实例化外部类。
三.匿名内部类
匿名内部类没有显式的类名,通常在创建对象的时候定义,可以直接在表达式中使用,不需要单独声明一个命名的类。
实验:匿名内部类
interface A {
public void printInfo();
}
class B implements A {
public void printInfo() {
System.out.println("Hello, world!");
}
}
public class Anony {
public static void main(String args[]) {
testFunc(new B());
testFunc(new A(){
public void printInfo() {
System.out.println("Hello, world2!");
}
});
}
public static void testFunc(A a) {
a.printInfo();
}
}
运行:
root@ubuntu:/home/topeet/guyilian# javac Anony.java
root@ubuntu:/home/topeet/guyilian# java Anony
Hello, world!
Hello, world2!
特点:
1.匿名内部类可以访问外部类所有的变量和方法,不能在匿名内部类中修改外部局部变量。
2.匿名内部类默认包含了外部类对象的引用。
3.使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
4.匿名内部类只能使用一次,它通常用来简化代码编写。