内部类的作用总括:
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);
}
});