内部类讲解

内部类:嵌套在其他类内部的类
根据出现的位置和关键字,可以分为四类
1.成员内部类
2.静态内部类
3.方法内部类
4.匿名内部类

  1. 成员内部类(用法与成员方法差不多,只不过它是个类。可以类比成员方法)
    a.private 不可以用在外部类的声明,但是可以用在内部类的声明。(成员变量可以private)
    在这里插入图片描述
    在这里插入图片描述
    b.内部类可以与外部类互相访问彼此的私有域。内部类访问外部类的私有域可以直接访问(因为内部类的内部有一个隐藏的外部类的对象),但是外部类访问内部类的私有域必须通过内部类对象访问。
//此处的public不能换为private
public class Outter {
    //成员变量
    private int age = 20;
    private String name = "zc";

    //成员内部类
    //此处可以变为private class
    private class Inner{
        private String msg = "hello Inner class";

        public void test (){
            System.out.println(msg);
            //内部类访问外部类的私有属性,直接访问
            System.out.println(age);
        }
    }
    //成员方法
    public void fun(){
        //外部类访问内部类的私有属性,必须通过内部类的对象来访问
        Inner inner = new Inner();
        System.out.println(inner.msg);
    }
}
c.内部类可以变相的解决java中单继承的现象。
class A{
    protected int age = 18;
}

class B{
    protected String msg = "hello bit";
}

public class Inherit {
    public static void main(String[] args) {
        Inherit inherit = new Inherit();
        inherit.fun();
    }
    
    //InnerClassA继承了A类,InnerClassB继承了B类,那么Inherit就变相继承了A,B中的属性。
    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);
    }
}

在这里插入图片描述
d.内部类可以对外部隐藏。
以上b,c,d三点也是为何会有内部类产生的原因。

注意!!!
a. 成员内部类不能拥有静态域。
b. 成员内部类可以访问外部类的静态域。(成员方法可以访问外部的static属性)
在这里插入图片描述

内部类与外部类的关系:
a.成员内部类的创建需要依赖于外部类对象(成员方法必须通过对象调用)
b.内部类与外部类相互独立,不是is a 关系
c.私有属性可以互相访问
d.创建内部类的语法:
1.在外部类内部创建内部类对象
在这里插入图片描述
2.在外部类的外部创建内部类对象
在这里插入图片描述
e.在内部类的内部调用使用隐藏的外部类对象(隐藏的this)
使用外部类对象—外部类类名.this.属性
内部类对象—this.属性
在这里插入图片描述

  1. 静态内部类(定义在外部类的内部,使用static修饰)—类比静态变量。无需外部类对象就能使用
    在这里插入图片描述
    注意:
    a. 外部类不能添加static(表示任何时候都可以调用执行)
    在这里插入图片描述
    b. 静态内部类不能访问外部类的成员域,能访问静态域。
    在这里插入图片描述
    c. 静态内部类可以有自己的成员变量
    d. 创建语法:
    在这里插入图片描述

对比静态内部类和成员内部类:
成员内部类:必须有外部类对象,—成员方法,可以访问外部类的静态域,但不能拥有静态域。
静态内部类:不依赖外部类对象,—静态方法,能拥有成员域,不能访问外部类的成员域。

  1. 方法内部类(定义在方法内部),类比局部变量。
    a. 对外部完全隐藏,因此在class之前不能有任何访问修饰符,无意义。
    在这里插入图片描述
    b. 若要使用方法的形参,只能有,不能改(形参的隐式final声明)
    在这里插入图片描述
    注意:
    a. 方法内部类没有访问形参时,这个形参可以在方法中随意修改。
    b. 方法内部类使用了形参,这个形参必须被声明为final。
    在这里插入图片描述

  2. 匿名内部类(经常用在多线程部分。定义在方法中,类都没名字)
    a. 必须继承一个抽象类,或者实现一个接口。
    b. 没有构造方法。
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值