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

本文详细介绍了Java中的四种内部类:成员内部类、静态内部类、局部内部类和匿名内部类的特点及应用场景。针对每种内部类,分别从定义、成员定义、访问方式等方面进行了深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值