一.成员内部类
实验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.匿名内部类只能使用一次,它通常用来简化代码编写。