读书人

各内部类的功用、定义、成员限制、访问

发布时间: 2012-12-28 10:29:05 作者: rapoo

各内部类的作用、定义、成员限制、访问总结

内部类的作用总括:
1.内部类可以独立的继承一个类和多个接口,提供了多继承的支持(若用接口为不同形式的继承);当然对于匿名内部类没有这样的能力,但是它在重载父类方法方面特别突出。
2.为外部类提供了一个可隐藏的强大的数据结构体。

?

记忆:1.在内部成员和静态成员相同和区别:

??? (1)各修饰都一样,包括控制限定和非控制限定。

?? (2)在外部类的方法中声明对象调用都是一样的。

? 区别:在外部类外成员内部类声明对象为: Outter.innner obj=new Outter.new inner();//因为为对象拥有

???????? 在外部类外静态成员的类声明对象为:Outter.inner obj=Outter.new innner();//不为对象拥有。

? 2.局部内部类中,本身方法里面的局部变量不可以访问,因为Inner对象的生命周期和外部类的周期一样,而方法内的变量的周期是暂时的,而声明为static即可使用。

3.匿名内部类和局部内部类一样都没有访问控制限制符,且比局部没有任何的非访问控制限定符。

在声明对象是重载方法,然后用当前对象.重载方法即可。

一、成员内部类

?

1.作用:相当于类的成员,作为外部类对象的一部分,为对象提供强大的功能支持。

? 2.定义: 访问控制修饰:private protected public

??????????????? 非访问控制修饰:final abstract。

???? 示例:

public class memberClass{
??? ? int j,k;
??? //? static int s=100;不能在成员内部类中定义static成员。所以没有对内部类静态成员访问问题。

...

}

3.成员的定义:全部类型的成员,可以有全部的控制修饰符,非控制修饰符就是static不能用。

4.访问:首先声明,

??? 类内部非静态和静态itself和之间相互访问的规则:只有静态方法访问非静态成员时要声明对象调用,其它itself和非静态调用静态都可以之间访问。

??? 类外部的访问规则:在可访问的条件下,调用类的非静态成员时要声明对象,调用类的静态成员是用类限定符。

?(1)外部类内部访问内部类成员,直接声明对象调用即可。

(2)外部类外访问内部类成员,1、可以封装到一个外部类的方法中然后调用.

??????????????????????????????????????????????????? 2.直接调用:

??????????????????????? 法一:testMemberClass mb=new testMemberClass()
????????????????????????????????? testMemberClass.memberClass mb2=mb.new memberClass();

??????????????????????? 法二:testMemberClass.memberClass mb2=new testMemberClass().new memberClass();

?得到对象后直接调用内部类的成员。其实法一、二都是一样的,先声明外部类的对象.声明内部类对象。

?二、静态内部类

1.作用:并不相当于外部类的静态成员,只是声明为独立于外部类对象的普通类,作用不大。

2.定义:访问控制符:控制访问:private protected public

??????????????????????????????????? 非控制访问:abstract static final

????????????????????????? 也就是所有的类访问控制符都可以,当然static一定要有。

?????? 示例:

? public static class StaticInner{//可以在里面声明static 成员,无论在哪里调用都用对象.f()调用,
??? ??? public static int? f(){//有些特别,出现了静态成员也不是静态成员了(本人测试过)。

...}

}

3.成员的定义:全部类型的成员,可以有全部的控制修饰符,非控制修饰符包括static都能用。

4.访问:

(1)外部类内部访问内部类成员,直接声明对象调用,和成员内部类一样(因为它不是静态的)。

(2)外部类外访问内部类成员,1、可以封装到一个外部类的方法中然后调用.(非静态的)

??????????????????????????????? 示例:TestStaticClass ts=new TestStaticClass();
??? ??????????????????????????????? ? ? ? ?? ts.outf();

?????????????????????????????????????????????????? 2.直接调用:???????????????????????????????? (静态的)

????????????????????? ??????? 示例:TestStaticClass.StaticInner inner=new TestStaticClass.StaticInner();
??? ???????????????????????????????????? inner.f();

在与成员内部类比较看出,构造方法部分少了一个new,其余都一样;这里要说明的是new是用来限制内部类的,所以用外部类名.静态的内部类对象。此时解释内部类又为静态的了,所以说静态内部类并不相当于静态的。

三、局部内部类

1.作用:相当于方法内的成员变量,可以为方法提供强大的数据结构且隐藏类,不是很常用。

2.定义:修饰符:没有控制修饰符,因为不是类的成员;非控制访问修饰符:final、 abstract.

?示例:public void getInner{

int x=100;

class methodClass{

//x=x+1;不能访问方法变量。

?}

}

3.成员的定义:全部类型的成员,可以有全部的控制修饰符,非控制修饰符就是static不能用(和成员内部类一样)。可以访问外部类的成员,可以访问方法的常量变量(不过方法的变量要声明为final,因为对象的生存期在运行方法后还存在,所以一般变量调用会引用不到,而final可以引用到)。

4.访问:

特别地:只能在方法中访问,因为其作用域为方法内部,所以只能在作用域内访问到。

?示例:

public void getInner(){

class Inner{

public void show(){}

}

Inner i=new Inner();

i.showl();

}

外部只能用调用封装了它的外部类的方法中调用.

如:object1.getInner();

四、匿名内部类:

1.作用:简化了声明一个类,直接覆盖父类的方法,然后调用。在事件处理中常使用。

2.定义:没有修饰符,包括控制访问和非控制访问的都没有。没有类名称,声明父类对象时创建自己的对象,且重载父类的方法。

示例:public class Outter{pblic void show(){};};

?class Test{

public static void main(String [] args){

Outter out=new Outter(){

public void show(){//重载show方法

}};

out.show();//和局部内部类一样,在方法中调用,但是在它的方法中创建对象只能创建父类对象时。

}

}

3.方法的修饰符,直接重载父类的方法,所以修饰符也一样。

4.访问:(1)在方法中访问,如上。

?(2)f.addMouseMotionListener(new MouseMotionAdapter() {// 匿名类开始
public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging:X=" + e.getX() + ",Y="
+ e.getY();
tf.setText(s);
}
});

读书人网 >编程

热点推荐