首页 > 其他分享 >Day16 内部类

Day16 内部类

时间:2023-12-04 17:56:30浏览次数:29  
标签:部类 Outer 内部 public Day16 outer class

1. 内部类的含义

内部类就是在一个类的内部再定义一个类。比如A类中定义了一个类B,那么 B就是A 的内部类,A是B的外部类

class A{//外部类
    class B{//内部类    
    }
}

内部类可以分为:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

默认:

  • 如果声明内部类时不使用任何修饰符,那么默认是public static(静态内部类)

  • 声明在接口中的内部类,默认是public static。


2.成员内部类

当内部类是外部类的数据时, 创建内部类对象之前需要先创建外部类对象。

生成一个内部实力的执行顺序为:

1.先加载外部类的静态代码块(按照上下顺序)
2.加载外部类的构造方法
3.加载内部类的构造方法

2.1 如何实例化?

先实例化一个外部类,再通过外部类的实例new 一个内部类的实例,该内部类实例的类型为 Outer.Inner

public class Outer {
    class Inner{}
}

public static void main(String[] args) {
        Outer outer = new Outer();
        //再通过这个外部类的实例来实例化内部类
        Outer.Inner inner = outer.new Inner();
}

2.2 内部类外部类的访问范围

public class Outer {
    private int outerId = 10;
    public void sameOut(){
        System.out.println("这是外部类同名的方法");
    }
    public void outerOut(){
        System.out.println("这是外部类非同名的方法");
    }
    /*public int getInnerId(){//获取内部类的私有属性
        //直接用变量名调用,无需加作用域
        return innerId;//报错中不到innerId
    }*/
   public class Inner{ //内部类也可以是public!!!
        private int innerId = 20;
        public void sameOut(){//与外部类方法同名没报错!
            System.out.println("这是内部类同名的方法");
        }
        public void innerOut(){//与外部类方法同名没报错!
            System.out.println("这是内部类非同名的方法");
        }
        public int getOuterId(){//获取外部类的私有属性
            //直接用变量名调用,无需加作用域
            return outerId;
        }
    }
}
public class main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //再通过这个外部类的实例来实例化内部类
        Outer.Inner inner = outer.new Inner();

        outer.sameOut();//这是外部类同名的方法
        inner.sameOut();//这是内部类同名的方法

        outer.outerOut();//这是外部类非同名的方法
        inner.innerOut();//这是内部类非同名的方法

        //inner.outerOut();//报错找不到outerOut()
        //outer.innerOut();//报错找不到innerOut()

        //System.out.println(outer.getInnerId());//报错,找不到innerId
        System.out.println(inner.getOuterId());//10
    }
}

根据上述运行结果我们可以得出:

  • 外部类引用无法访问内部类的私有成员或者任何成员函数
  • 内部类引用无法直接访问外部里的任何成员函数,但是可以访问外部类的私有长远函数
  • 外部类、内部类可以有同名的方法,但是外部类、内部类引用会调用各自的方法

3.静态内部类(编译器源码用的比较多)

  • static可以修饰内部类,非内部类不能被它修饰

  • 使用static修饰符修饰的内部类称之为静态内部类,也有人称静态内部类为嵌套类。

  • 创建静态内部类不会加载外部类的静态代码块,不会调用外部类的构造方法,所有内部类无妨访问外部类非静态成员属性(任何非静态变量)。

class A{//外部类
    private int id;
    class static B{//内部类 
        public int getOuterId(){//获取外部类的私有属性
            return id;//报错,静态内部类无法访问外部类的
    }
}

4. 局部内部类(可以认为是函数内部类)

  • 定义在方法内的内部类,我们称之为局部内部类。

  • 局部类不能用public或private修饰符进行声明。它的作用域被限定在声明这个局部类的块中。

  • 局部类有一个优势, 即对外部世界可以完全地隐藏起来。

5.匿名内部类

标签:部类,Outer,内部,public,Day16,outer,class
From: https://www.cnblogs.com/wendao101/p/17875554.html

相关文章

  • devops - 企业内部搭建git服务器
    step1.登录远程服务器,新建git用户,及用户主目录,ssh配置目录,初始化git仓库#新建git用户组sudogroupaddgit#新建git用户并设置用户组,并创建用户主目录/home/gitsudouseradd-ggit-mgit#给新建的git用户设定密码sudopasswdgit#重新以git用户身份登录ss......
  • 无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实
    无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实习生日志(2023.12.4)导航目录无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实习生日志(2023.12.4)导航遇到的困难/问题描述解决的经过与思路造成的原因解......
  • Python 的 tqdm 如果在内部使用print打印 会重复打印进度条 怎么避免这个问题?
    要避免在使用Python的tqdm库时在内部使用print打印时重复打印进度条,您可以通过使用tqdm库提供的特殊函数tqdm.write()来实现。tqdm.write()函数会将输出写入到标准输出,而不会干扰进度条的显示。下面是一个示例:fromtqdmimporttqdmimporttime#创建一个范围为10的进度条fori......
  • Day16 三元运算符
    三元运算符扩展赋值运算符+=-=*=/=packageoperator;publicclassDemo07{publicstaticvoidmain(String[]args){inta=10;intb=20;a+=b;//a=a+ba-=b;//即a=a-b不推荐比较偷懒//字符串连接......
  • ThreadPoolExecutor线程池内部处理浅析
    我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务。本文主要通过java的ThreadPoolExecutor来查看线程池的内部处理过程。1ThreadPoolExec......
  • Android的内部存储和外部存储怎么区分?
    1.定义内部存储:内部存储位于Android手机系统的data/data/<包名>这个目录下,内部存储是私有的,主要用于存储系统和应用程序的某些数据,对于其他应用程序来说是不可见的,并且会随着应用程序的卸载而被删除。外部存储:外部存储可以分为外部私有存储和外部公有存储。外部私有存储......
  • Ant-Design modal对话框未打开时,无法通过uesRef获取modal内部元素DOM节点
    为什么要记录下来呢?因为我在网上和chatGpt上没有搜到合适的解决方案。在CDNS上看到个和我遇到问题一样的,居然要收费才能看,所以自己记下来。当然肯定还有其他的好方案,欢迎大家留言。需求:使用antdV/g6画关系图,类似于企查查上面的那样:点击按钮打开Modal框,把数据渲染到Modal框的div......
  • 用于安全研究和取证的 ETW 内部结构
    原文链接:https://blog.trailofbits.com/2023/11/22/etw-internals-for-security-research-and-forensics/为什么Windows事件跟踪(ETW)对于Windows10和11中的终端检测和响应(EDR)解决方案变得如此关键?答案在于它通过安全ETW通道向安全工具提供的情报价值,这些通道现......
  • 内部类
    内部类内部类是一种较为特殊的类形式,定义在另一个类中的类,叫做内部类,是主类的一部分,可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性。作用内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据内部类可以对同一个包中的其他类隐藏起来内部类分为静......
  • pythonDay16
    wraps装饰器补充 有参函数补充,特殊情况 有参函数装饰器,登录功能当中当账号密码来源于不同地方时 有参函数装饰器有语法糖(解决方案一,但比较复杂)有语法糖的解决方案二 有参装饰器的模板 什么是可迭代对象、什么叫迭代器,如何用 迭代器如何取值 for循环也可以......