全网最全内部类介绍

内部类:顾名思义内部类是嵌套在其它类内部的类,根据出现的位置和修饰的关键字可分为四种。分别是:成员内部类、静态内部类、方法内部类和匿名内部类。

(1)成员内部类:用法和成员方法类似,定义在外部类的内部使用,并且可以用private修饰,但需注意外部类不可用private修饰。

public class Outter {
        private int age;
        private String name;
    //成员内部类,private可修饰内部类,但不可修饰外部类。

 class Inner{
        private String msg = "hello Inner Class";

        public void test() {
            System.out.println(msg);
            //可以访问外部类的私有域
            System.out.println(age);
        }
    }
}

特点:1.内部类可以用private修饰,但需注意外部类不可用private修饰。

2.内部类和外部类是可以相互访问彼此的私有域,并其内部类可以直接访问外部类的私有域。是因为成员内部类的内部有隐藏的外部对象。实现请看上面的代码块。而外部类访问内部类的私有域则必须经过内部类的对象访问。

   public void fun(){               
        //外部类的成员方法
        //创建内部类对象
        Inner inner = new Inner();
        System.out.println(inner.msg);

    }

3.内部类可以变相解决java的单继承局限。

class A{
    protected int age = 11;
}
class B{
    protected String msg = "hello world";
}
public class Inherit {

    public static void main(String[] args){
        Inherit inherit = new Inherit();
        inherit.fun();

    }
    class InnerClassA extends A{}

    class InnerClassB extends B{}

    public void fun(){
        InnerClassA a = new InnerClassA();
        InnerClassB b = new InnerClassB();
        System.out.println(a.age);
        System.out.println(b.msg);

    }


}

4.内部类可以对外部隐藏。

---------------特点的2.3.4是内部类存在的意义。--------------------------------------------------------------------内部类与外部类的关系:

1.成员内部类的创建需要依赖外部类对象。类比成员方法必须通过对象调用,在没有外部类实例之前无法创建成员内部类对象。

2.内部类与外部类是相对独立。

3.两者之间的私有属性互相访。

4.创建内部类的语法:

(1).在外部类的内部创建内部类对象

        Inherit inherit = new Inherit();

(2).在外部类的外部创建内部类对象(内部类没有被private修饰)

class Text{
    public static void main(String[] args) {
        Outter.Inner inner = new Outter().new Inner();
    }
}

5.在在内部类的内部使用隐藏的的外部类对象(this)

 class Inner{
        private String msg = "hello Inner Class";
        private int age = 20;
        public void test() {
            System.out.println(msg);
            //可以访问外部类的私有域
            System.out.println(Outter.this.age);
            System.out.println(this.age);
        }
    }

**************************************************************************************************************

注意:成员内部类不能拥有静态域,但却可以访问外部类的静态域。

(2)静态内部类:定义在外部类的内部并用static修饰。

特点:1.静态内部类无需外部类对象产生就能使用,但不能访问外部类的成员域,能访问外部类的静态域。

package innerclass;

public class StaticInnerClass {
    static int age;
    String name;
    static class Inner{
        public void test(){
            System.out.println(age);
            System.out.println(name);
        }
    }
}

由上面例子可知,静态内部类可以正常访问age,但不能正常访问name,运行后会出现报错。

 2.静态内部类可以有自己的成员域。

3.静态内部类与成员内部类的比较:

成员内部类▬必须有外部类对象▬类比成员方法▬能访问外部的静态域,但不能拥有静态域。

静态内部类▬不依赖外部类对象▬类比静态方法▬能拥有成员域,但不能访问外部类的成员域(除static修饰以外)

静态内部类的创建语法:

 StaticInnerClass.Inner inner = new StaticInnerClass.Inner()

(3)方法内部类:定义在方法内部

package innerclass;

public class FunClass {
    public void fun(){
        //9方法内部类  局部变量
        int a = 23;
        class Inner{
            
        }
    }
}

特点:

1.对外部完全隐藏,因此方法内部类不能有任何访问修饰符,没有意义。

2.若要使用方法的形参,只能用不能改。

a.方法内部类没有访问形参时,这个形参可以在方法中随意修改。

b.方法内部类使用了形参,这个形参必须被声明为final.

(4)匿名内部类:定义在方法中,类都没有名字。

特点:

1.经常用在多线程部分。

2.必须继承一个抽象类或者实现一个接口。

3.没有构造方法,用一次就销毁。

实现结果如下:

package innerclass;
interface IMessage{
    void fun();
}//接口
public class NoNameClass {
    public static void main(String[] args) {
        IMessage msg = new IMessage() {
            //匿名内部类
            @Override
            public void fun() {
                System.out.println("hello world");
            }
        };
        msg.fun();
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值