JAVA面向对像基础之——内部类

来源:互联网 发布:淘宝的明星店铺有哪些 编辑:程序博客网 时间:2024/06/03 15:23
JAVA面向对像基础之——内部类

一个类内部还可以定义另一个类,这个类称为内部类,内部类可以访问外部的成员(包括私有),而要想访问内部类的成员,则必须先创建对像。
内部类根据定义所在位置不同分为:
1. 成员内部类:在外部类的成员定义位置定义,相当于外部类的一个成员。
2. 局部内部类:在外部类的一个方法内部定义。
3. 匿名内部类。

1.  成员内部类测试如下,要注意成员内部类的访问方式
package 内部类;class Persion{public String name;public int    age;//成员内部类class Clothes{//内部类成员变量public String coat;public String trouser;public Clothes(String coat,String trouser){this.coat = coat;this.trouser = trouser;}//内部类成员方法public void show(){System.out.println("我是内部类");}}//外部类的无参构造public Persion(){}//外部类的有参构造方法public Persion(String name, int age){this.name = name;this.age  = age;//创建内部类对像,才能访问内部类成员Clothes c = new Clothes("外套","裤子");c.show();}}public class InnerTest1{public static void main(String[] args){//创建一个外部类的对像Persion p = new Persion("人名",50);//创建一个内部类的对像//格式:外部类.内部类   变量名 = new 外部类().new 内部类Persion.Clothes pc = new Persion().new Clothes("外套","裤子");System.out.println(p.name + "    " + p.age);System.out.println(pc.coat + "    " + pc.trouser);pc.show();}}
2.  成员内部类一般加private修饰,用于保证数据的安全。成员内部类还可以加上static,静态成员内部类测试如下:
package 内部类;//外部类class Outer{public String name;public int  age;//成员内部类public static class Inner{//成员内部类方法public void show(){System.out.println("我是静态成员内部类");}}}public class InnerTest2{public static void main(String[] args){//创建一个内部类对像//格式: 外部类.内部类   变量名   =  new 外部类.内部类()Outer.Inner i = new Outer.Inner();//调用内部类的方法i.show();}}

3. 局部内问类定义在外部类的成员方法内部,测试代码如:
package LocalInner;//外部类定义class Outer{//外部类成员方法public void method(){//局部变量要定义为final才能被局部内问类访问,否则会报错final  int x = 100;//内部类定义class Inner{//内部类成员方法public void show(){//局部内部类只能访问final类型的局部变量System.out.println("我是局部内部类 " + x);}}//必须定义一个内部类的对像,才能访问内部类的成员Inner i = new Inner();i.show();}}public class InnerTest3{public static void main(String[] args){//定义一个外部类对像Outer o = new Outer();//访问外部类成员o.method();}}

上例中可以看到局部内部类可以访问局部变量,但是这个局部变量要为final,否则编译器报错,为什么?

答:变量加上final修饰后,就变为常量,而常量是没有存储在栈区中!普通局部变量存储于栈区,方法调用完毕,内存空间释放,不存在,故不能再被堆中的对像使用,而常量还存在于内存中(常量存在于常量池中),故还可以被内部类的对像使用。

4. 匿名内部类,实际上还是一个内部类,只不过以匿名对像的形式使用它。gui部分的事件监听机制中见到最多。

匿名类使用的前提是要有一个类或者接口,这个类可以是抽像类,也可以是具体类。
格式:new  类名或接接口名{
重写方法;
     }
本质上就是一个继承了该类或实现了该接口的一个子类的一个匿名对像。

例1,给按钮添加动作事件监听机制,监听按下动作,new ActionListener()是一个继承了ActionListener类的子类的一个匿名对像:
//给button添加事件监听机制button.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){//按钮按下时处理事件}});

例2,给文本框添加按键输入输入监听机制,new KeyAdapter()是一个实现了KeyAdapter适配器接口的子类的一个匿名对像:
//给textField添加按键监听机制textField.addKeyListener(new KeyAdapter(){@Overridepublic void keyTyped(KeyEvent e){}});



0 0
原创粉丝点击