首页 > 其他分享 >内部类

内部类

时间:2023-10-17 21:11:29浏览次数:18  
标签:Outer 内部 对象 Inner new public

内部类

写在一个类里面的类叫做内部类

内部类的分类

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

成员内部类

写在成员位置的,属于外部类的成员。

成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等。

在成员内部类中,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。

public class Outer {
    String name;
    Private class Inner{
        
    }
    //因为Inner用private修饰,故需要提供给其他类创建对象的方法,用getInstance获取Inner对象给使用者
    public Inner getInstance(){
        return new Inner();
    }
}
public class test{
    public static void main(String Args[]){
        Outer o = new Outer();
        /*由于private修饰,所以不能使用Inner.oi去获取getInstance返回的对象,可以使用其父类object(超类)来接收*/
        object oi = o.getInstance();//$符号供内部类使用
        System.out.println(oi);//Outer$Inner@4eec7777
        //outer.Inner oi = new OUter().new Inner();
        //System.out.println(Outer.this.变量名);
    }
}

/内部类的堆内存中会自动生成一个“父类名.this”去记录外部类的地址/

静态内部类

静态内部类是一种特殊的成员内部类。

静态内部类只能访问外部类中的静态变量和静态方法,如果想访问非静态的需要创建外部类的对象。

创建静态内部类对象的格式:外部类名 对象名=new 外部类名.内部类名()

//new出来的对象是Inner的对象
Outer.Inner oi = new Outer.Inner();

调用非静态方法的格式:先创建对象,用对象调用

调用静态方法的格式:外部类名.内部类.方法名();

局部内部类

将内部类定义在方法里面就叫做局部内部类,类似与方法里面的局部变量。局部内部类和局部变量一样,都不能使用public,static,protected等修饰符修饰

外界是无法直接使用,需要在方法内创建局部内部类的对象并使用。

该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

pubolic class Outer{
    public void show(){
        int a = 10; 
    }
    //局部内部类
    class Inner{
        String name;
        int age;
        public void method1(){
            System.out.println("局部内部类中的method1方法");
        }       
        public static void method2(){
            System.out.println("局部内部类中的method2静态方法");
        }
    }
    //创建局部内部类的对象
    Inner i = new Inner();
    System.out.println(i.name);
    System.out.println(i.age);
    i.method1();
    Inner.method2();
}
匿名内部类(常用且重要)

匿名内部类本质上就是隐藏了名字的内部类(继承/实现、方法重写、创建对象)

example:
	//new 类名或者接口名
	new Inner() {
        //需要重写方法
        public void show() {
        }
    };//注意大括号末尾有一个分号

匿名内部类可以写在成员位置,也可以写在局部位置

匿名内部类格式的细节:1,包含了继承或实现,方法重写,创建对象。2,整体就是一个类的子类对象或者接口的实现类对象。

使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。

很牛逼QAQ

// Today is not easy, tomorrow is more difficult, but the day after tomorrow will be wonderful.

标签:Outer,内部,对象,Inner,new,public
From: https://www.cnblogs.com/JenckMin/p/17770668.html

相关文章

  • Java内部类进行回调的场合和范例
    大力:“内部类回调外部类的实现,是咋回事?”卫琴:“回调实质上是指一个外部类尽管实际上实现了某种功能,但是没有直接提供相应的接口,客户类可以通过这个外部类的内部类的接口来获得这种功能。而这个内部类本身并没有提供真正的实现,仅仅调用外部类的实现。可见,回调充分发挥了内部类具有访......
  • 威纶通触摸屏如何用内部地址做配方
    一般威纶通触摸屏我们都是用配方数据库来做配方,可有些触摸屏型号是不支持配方功能的,或者你觉得用软件的配方检视窗口做出来的画面不好看,这时候我们就可以用内部地址来做配方了,这里以一个配方5个数据为例给大家演示一遍。 步骤一:新建数值输入元件,选择RW内部地址再加上索引寄......
  • 成员内部类
    packagecom_black.InnerClass.s1;publicclassOuter{privateints=10;/*publicclassInner{publicvoidshow(){System.out.println(s);*/privateclassInner{publicvoidshow(){System.out.print......
  • VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点
    判断一个点,判断是否在风格stl模型内部,或表面:目录1.方案一:使用vtkCellLocator  FindClosestPoint找到模型上距离给定点最近的一点,计算两点的距离,小于某一阈值则认为此点在模型上;2.方案二使用vtkKdTreePointLocator3.方案三使用vtkSelectEnclosedPoints1.方案一:使用vtk......
  • np.array强制内部元素格式统一
    df_test=pd.DataFrame(data=np.array([np.repeat(['class'+str(i+1)foriinrange(2)],10),list(range(10,0,-1))*2,list(range(1,11))*2]).T,columns=['class']+['x'+str(i+1)for......
  • java 四种内部类
    四种内部类基本介绍:一个类的内部又完整嵌套了了另一个类结构,被嵌套的类称为内部类属性,方法,构造器,代码块,内部类类的五大成员内部类是学习的难点,同事也是重点,后面看底层源码时,有大量得到内部类1.定义在外部类的局部位置上(比如方法内):局部内部类(有类名)匿名内部类(没有类名......
  • npm install -g yarn 安装yarn之后提示:'yarn' 不是内部或外部命令,也不是可运行的程序
    操作系统:win10node版本:v14.21.31:npminstall-gyarn 2:yarn 报错:'yarn'不是内部或外部命令,也不是可运行的程序或批处理文件。3:yarn 安装在C:\ProgramFiles\nodejs\node_modules\corepack\shims4:设置PATHsetPATH=%PATH%;C:\ProgramFiles\nodejs\node_modules\core......
  • java内部类有什么好处
    内部类:一个内部类的定义是定义在另一个内部的类。原因是:1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。2.对于同一个包中的其他类来说,内部类能够隐藏起来。3.匿名内部类可以很方便的定义回调。4.使用内部类可......
  • 用Artifactory管理内部Maven仓库
    1.介绍Maven是Java开发者中流行的构建工具,Maven的好处之一是可以帮助减少构建应用程序时所依赖的软件构件的副本,Maven建议的方法是将所有软件构件存储于一个叫做repository的远程仓库中。Maven会从ibiblio.org中的公用仓库中同步构件,这个公用仓库下载缓慢、不稳定,并且......
  • Python 内部类,内部类调用外部类属性,方法
     一Python中内部类classMyOuter:age=18def__init__(self,name):self.name=nameclassMyInner:def__init__(self,inner_name):self.inner_name=inner_nameout=MyOuter('lqz')inner=out.MyInner('lqz_inner�......