/*
* 内部类
* 定义在另一个类中的类,称为内部类Inner Class
* 包含内部类的类,称为外部类Outer Class
*
* 应用场合:在窗体程序中进行事件处理
*
* 分类:
* 成员内部类
* 局部内部类
* 静态内部类
* 匿名内部类
*
* 成员内部类
* 1.在外部类中访问内部类,可以访问内部类中的所有成员,包含private修饰的
* 2.在外部类外访问内部类,不能访问内部类中的private修饰的成员
* 3.在内部类中访问外部类,直接访问,如果内部类和外部类的变量名相同,可使用“外部类.this.变量”
*/
public class Test12 {
public static void main(String[] args) {
Outer out=new Outer();//创建外部类的对象
/*out.print();//调用外部类的方法*/
//2.在外部类外访问内部类
//在外部类的外部创建内部类的对象,语法:外部类.内部类 对象名=外部类对象.new 内部类();
//Outer.Inner in=out.new Inner(); //必须先创建外部类的对象
Inner in=out.new Inner();
//System.out.println(in.age);//无法访问内部类的private成员
in.show();
}
}
/*
* 外部类Outer,内部类Inner
* 编译后,会生成三个字节码文件:Test12.class、Outer.class、Outer$Inner.class
* 成员内部类名称:外部类名$内部类名.class
*/
class Outer{ //外部类
private String name="tom";//外部类的成员变量
static String address="南京";
class Inner{ //内部类
private int age=20;//内部类中的成员变量
private String name="张三";
String address="北京";
public void show(){
String address="天津";
System.out.println("内部类中的show方法");
//3.在内部类中访问外部类
System.out.println("内部类中的name:"+this.name);
System.out.println("外部类中的name:"+Outer.this.name);
System.out.println("内部类中的age:"+age);
System.out.println("内部类中的address:"+this.address);
System.out.println("外部类中的address:"+Outer.address);
System.out.println("内部类中的局部变量address:"+address);
}
}
//1.在外部类中访问内部类
public void print(){
System.out.println("外部类中的print方法");
Inner in=new Inner();//直接创建内部类的对象
System.out.println(in.age);//访问内部类的属性,可以访问private成员
in.show();
}
}
/*
* 局部内部类
* 也称为方法内部类,即定义在外部类的方法中的类
* 1.访问范围:只能在外部类的方法中使用,不能使用修饰符进行修饰
* 2.在局部内部类中不能访问外部类的方法中非final修饰的成员
*/
public class Test01 {
public static void main(String[] args) {
MOuter out=new MOuter();
out.show();
}
}
class MOuter{
String name="tom";
public void show(){
final int age=20;
System.out.println("外部类中的show方法");
class MInner{ //局部内部类
String sex="male";
private String address="南京";
public void print(){
System.out.println("局部内部类中的print方法");
System.out.println("外部类中的成员变量name:"+name);
System.out.println("外部类中局部变量age:"+age);
}
}
//只能在外部类的方法中使用
MInner in=new MInner();
System.out.println(in.sex);
System.out.println(in.address);
in.print();
}
}
/*
* 静态内部类
* 使用static修饰的成员内部类
* 不能访问外部类中非static成员
*/
public class Test02 {
public static void main(String[] args) {
//创建静态内部类,无需创建外部类的对象
SInner in=new SInner();
in.show();
}
}
class SOuter{
static String name="tom";
static class SInner{ //静态内部类
String sex="male";
public void show(){
System.out.println("静态内部类中的show方法");
System.out.println("外部类中的name:"+name);
}
}
}
/*
* 匿名内部类
* 即没有名字的内部类,因为此类只需要使用一次,所以没有起名字的必要
* 1.在创建匿名内部类时,必须作为new语句的一部分来声明,用法:
* 接口|抽象类 对象名 = new 接口|抽象类{
* //匿名内部类
* }
* 2.在创建匿名内部类时,会自动创建一个匿名内部类的对象,并赋给变量
*/
public class Test03 {
public static void main(String[] args) {
Service s=new Service(){//匿名内部类
//实现接口中的抽象方法
public void show(){
System.out.println("实现Service接口的匿名内部类");
}
};
s.show();
Animal pig=new Animal() {
@Override
public void play() {
System.out.println("小猪快跑。。。。");
}
@Override
public void show() {
System.out.println("小猪快吃。。。。。");
}
};
pig.show();
pig.play();
Student stu=new Student(){
public void show(){
System.out.println("俺是小学生,嘻嘻嘻嘻");
}
};
stu.show();
}
}
/*
* 定义接口
*/
interface Service{
//抽象方法
void show();
}
/*
抽象类
*/
abstract class Animal{
String name;
public void show(){
System.out.println("动物在吃。。。。");
}
public abstract void play();
}
class Student{
public void show(){
System.out.println("嘿嘿嘿嘿嘿嘿");
}
}
原文地址:http://blog.csdn.net/wangzi11322/article/details/44801815