前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)

Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)

作者头像
Winter_world
发布于 2020-09-25 02:25:28
发布于 2020-09-25 02:25:28
55600
代码可运行
举报
运行总次数:0
代码可运行

1、基本概念

类的组成包括:成员、方法,几乎所有程序都不会对嵌套程序有什么限定,内部类指的是在一个类中继续嵌套其他类结构的一种代码形式,且理论上可以一直嵌套。

【举例】:观察内部类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Outer o = new Outer();
        o.fun();
    }

}

class Outer{ //外部类
    private String info = "hello";
    class Inner{ //内部类
        public void print(){
            System.out.println(info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
    }
}

类本身的核心组成就应该是属性和方法,但是引用了内部类的话,程序结构就被破坏了,那么内部类的好处在哪?若将内部类拿出,变为两个类,程序改动非常大,内部类的最大好处就是可以直接进行外部类的私有属性访问。

现在有以下几个问题:

(1)在编写代码中,只要是属性的访问,一定要加this,但由于属性是外部类的,所以需要:外部类.this.属性;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Outer{ //外部类
    private String info = "hello";
    class Inner{ //内部类
        public void print(){
            System.out.println(Outer.this.info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
    }
}

(2)以上代码,内部类可以方便操作外部类私有属性,那么外部类是否可以访问内部类的私有属性:答案,是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Outer o = new Outer();
        o.fun();
    }

class Outer{ //外部类
    private String info = "hello";
    class Inner{ //内部类
        private String msg = "world";
        public void print(){
            System.out.println(Outer.this.info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
        System.out.println(inner.msg);
    }
}

由以上可知,内部类和外部类的私有属性是可以直接访问的。

(3)目前可发现,实例化内部类的对象操作都是在外部类的fun()方法里面完成的,其他类是否可以直接操作内部类对象,在其他类中实例化内部类对象,语法如下:

  • 外部类名称.内部类名称 对象名称 = new 外部类().new 内部类();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Outer.Inner inner = new Outer().new Inner();
        inner.print();
    }

}

class Outer{ //外部类
    private String info = "hello";
    class Inner{ //内部类
        private String msg = "world";
        public void print(){
            System.out.println(Outer.this.info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
        System.out.println(inner.msg);
    }
}

(4)内部类可以通过private定义为私有内部类,仅可以被其外部类使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Outer{ //外部类
    private String info = "hello";
    private class Inner{ //内部类
        private String msg = "world";
        public void print(){
            System.out.println(Outer.this.info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
        System.out.println(inner.msg);
    }
}

2、static定义内部类

利用static定义的 属性和方法是不受类的控制的,相当于一个局外结构,如果内部类使用了static定义,那么此内部类就相当于变成了外部类,只能访问外部类的static属性。

【举例】:利用static定义内部类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Outer{ //外部类
    private static String info = "hello";
    static class Inner{ //static内部类 = 外部类
        private String msg = "world";
        public void print(){
            System.out.println(info);
        }
    }
    public void fun(){
        Inner inner = new Inner();
        inner.print();
        System.out.println(inner.msg);
    }
}

既然static内部类变成了外部类,那么外部类就可以被其他类直接进行操作。但是这时候的实例化格式为:

  • 外部类名称.内部类名称 对象名称 = new 外部类.内部类();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        Outer.Inner inner = new Outer.Inner();
        inner.print();

后续开发中,我们见到的程序类库中出现xxx.xxx就表示的是内部类。

3、方法中定义内部类

理论上内部类可以在任何位置中定义,包括:代码块、类中、方法中,实际开发中,有可能在方法中使用内部类。

【举例】:方法中写内部类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Outer outer = new Outer();
        outer.fun(100);
    }

}

class Outer{ //外部类
    private  String info = "hello";

    public void fun(int temp){
        double sal = 9000.0;
        class Inner{
            public void print(){
                System.out.println("Outer类中的info属性="+Outer.this.info);
                System.out.println("fun()方法中的参数temp="+temp);
                System.out.println("fun()方法中定义的临时变量sal="+sal);
            }
        }
        new Inner().print();
    }
}

【注意】:目前使用的是JDK1.8,如果是1.8以前的版本,一个方法中定义的内部类要访问方法的参数或定义的变量,那么参数或变量前必须要加final。

4、总结

  • 1)不需要考虑怎么用内部类,一般开发用的较少,但是会使用;
  • 2)内部类先看明白它的语法形式。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java入门提高篇】Day6 Java内部类——成员内部类
弗兰克的猫
2018/01/09
4920
java内部类深入详解 内部类的分类 特点 定义方式 使用
java内部类 内部类的分类 特点  定义方式 使用   外部类调用内部类 多层嵌套内部类  内部类访问外部类属性  接口中的内部类  内部类的继承  内部类的覆盖  局部内部类 成员内部类 静态内部类 匿名内部类
noteless
2018/09/11
4950
java内部类深入详解 内部类的分类 特点  定义方式 使用
Java内部类-成员内部类、局部内部类、匿名内部类、静态内部类
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。我们知道类的五大成员:属性、方法、构造器、代码块、内部类。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
joshua317
2021/12/17
1.2K0
Java内部类-成员内部类、局部内部类、匿名内部类、静态内部类
java——内部类和异常处理
Java内部类(Inner Class)是嵌套在其他类中的类,它可以访问外部类的成员变量和方法,同时也可以被外部类访问。Java内部类主要有四种类型:
一只
2024/07/05
1290
Java基础——package+权限修饰符+内部类
编译:在D盘下有Person_Test.java ,在D盘下打开dos命令行执行 javac -d . Person_Test.java 命令就会生成一个D:/com/heima/Person_Test.class
阿Q说代码
2021/05/13
2780
Java基础——package+权限修饰符+内部类
没有任何类型 Windows 的外层实例可访问---Java内部类与外类型
Java内部类与外部类 错误提示: 没有任何类型 TestThread 的外层实例可访问。必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配。 public class CarTest { public class Car{ String engine; String Wheel; public void run(){ System.out.println("汽车在奔跑"); } } /
似水的流年
2018/01/18
1.5K0
Java程序员必备基础:内部类解析
在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。
捡田螺的小男孩
2020/04/15
1K0
Java程序员必备基础:内部类解析
Java 内部类
在类的内部定义另一个类。定义就这么简单。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。内部类的定义格式如下:
赵哥窟
2018/12/24
3840
Java 内部类
1 、说点闲话   因为个人原因,布衣博主的技术博文大半年来一直没时间更新(WHAT ? 这是啥理由),恍恍惚惚间,一年又是头,还是得跳出来,给自己一个交代。   编程日久,项目开发中最常用的技能大概
用户1615728
2019/02/13
6790
【Java 学习】:内部类详解
📃📃本文将通过Java内部类 是什么,为什么被广泛使用,以及又该如何去使用这三个方面来详细讲解其相关知识。
IsLand1314
2024/10/15
1210
【Java 学习】:内部类详解
Java内部类——静态和非静态内部类、匿名内部类、方法内部类
概念讲义转载自https://www.sxt.cn/Java_jQuery_in_action/five-inner-class.html
逆回十六夜
2019/08/09
9260
java内部类总结(附代码说明)
1,概述 内部类是指在一个外部类的内部再定义一个类。 内部类作为外部类的一个成员,并且依附于外部类而存在的。 内部类可为静态,可用PROTECTED和PRIVATE修饰。(而外部类不可以:外部类只能
用户11293412
2024/10/09
890
第30节:Java基础-内部类
内部类可以直接访问外部类,但是外部类要访问内部类中的成员变量,就必须要创建内部类的对象。
达达前端
2019/07/03
3510
第30节:Java基础-内部类
java静态内部类和成员内部类的区别
如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
IT工作者
2022/05/09
1K0
java之内部类
成员内部类的优点: ⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。) ⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
猫头虎
2024/04/07
1260
Java 基础巩固:内部类的字节码学习和实战使用场景
本文介绍了内部类的概念、特点、使用场景以及Java中的内部类实现机制。内部类可以高效地访问非静态成员变量和调用非静态成员方法,并且可以在编译期间不依赖于外部类的实现。在Java中,内部类实现机制包括匿名内部类、局部内部类、静态内部类和嵌套内部类。
张拭心 shixinzhang
2018/01/05
1.3K0
Java 基础巩固:内部类的字节码学习和实战使用场景
JavaSE(七)之内部类
上一篇我们学习了接口还有访问控制,在以后的工作中接口是我们经常要碰到的,所以一定要多去回顾。接下来介绍一下内部类。很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次 这个时候我们就可以使用内部类了。 一、内部类概述   内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我们可以把外边的类称为外部类,在其内部编写的类称为内
用户1195962
2018/01/18
8390
Java 内部类 && 常用API
格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
繁依Fanyi
2023/05/07
1720
Java基础知识(六)--内部类
当t.play()方法出栈后,play中的局部变量就会随之销毁,但是我的内部类对象可能仍然存在的(当不再被使用才会被垃圾回收器回收)这时在内部类中访问了局部变量x,但此时的x已经被销毁,形成矛盾.
用户7386338
2021/05/13
2120
《JAVA EE》内部类(上篇)注意事项
在外部类的内部不使用static关键字定义的内部类就是成员内部类。(类比成员属性和成员方法)
VIBE
2022/12/02
2520
相关推荐
【Java入门提高篇】Day6 Java内部类——成员内部类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文