Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java-“this”和“类名.this”以及“类名.class”的区分和详解

Java-“this”和“类名.this”以及“类名.class”的区分和详解

作者头像
Fisherman渔夫
发布于 2020-02-18 08:28:34
发布于 2020-02-18 08:28:34
7.9K00
代码可运行
举报
文章被收录于专栏:渔夫渔夫
运行总次数:0
代码可运行

引言:

对于以上三个语法结构的区分,需要先理解Class类 所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类对象”,每个类的类对象是唯一且是不可变的。而在对象创建的时候,由于类对象已加载,所以可以添加上类型标签。


1. Class类介绍:

此类的介绍是为了解释 类名.class的含义。

1.1 Class类简介:

  1. Class类只有私有的构造方法,所以不能使用new关键词来创建一个Class对象;只有JVM虚拟机可以创建一个类对象,且是在类加载的时候被调用的。
  2. 运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
  3. 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象,和其名字相同的类对象名。
  4. 每个数组属于被映射为 Class 对象的一个类,所有具有相同类型维数的数组都共享该 Class 对象。只不过数组对象的名字比较奇怪
  5. 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

1.2 得到类对象的三个方法:

虽然我们不能使用构造器得到Class对象,但是却可以通过其他方法得到:(注意,class对象可以是接口) 我们先创建一个对象,比如: String类: String str = new String("Hello World");

方法1:通过 对象.getClass()得到对象类(非静态方法): Class classOfString=str.getClass();

注意事项:getClass方法继承于Object类,是一个native方法

方法2:通过Class类的静态方法forName()返回类对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        try {
            Class classOfString2=Class.forName("java.lang.String");
            System.out.println(classOfString2);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

注意事项:

  1. forNanme()方法会抛出异常ClassNotFoundException,所以需要使用try-catch语句捕获。
  2. forName方法输入参数为类名,而不是对象名,并且要完整写出类路径,否则会抛出异常

方法3:通过类名.class返回此类对象(非静态方法): Class classOfString3=String.class;

介绍完以上三种方法,不仅知道了得到Clas对象的方法,也知道了类名.class是什么意思了,其就是返回类名所对应的唯一类对象。


1.3 Class类的常用方法:

  1. getName() 其原理上调用了一个本地私有方法的非静态方法,返回String类型的实例,代表Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
  2. newInstance() 此方法用于返回一个类对象的实例,实例构造只能无参构造器,且为弱类型(即Object类型)。 例子:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	try {
            	String s =(String) classOfString.newInstance();
        } 	catch (InstantiationException e) {
            	e.printStackTrace();
        	} 	catch (IllegalAccessException e) {
            	e.printStackTrace();
        }

可见由于newInstance返回的是Object类型,所以需要额外向下强制转型。

  1. getClassLoader() 返回该类的类加载器。
  2. getComponentType() 返回表示数组组件类型的 Class。
  3. getSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
  4. isArray() 判定此 Class 对象是否表示一个数组类。

2. this关键词:

this关键字的三大应用:

  1. this调用本类中的属性,也就是类中的成员变量,例如:set和构造器中经常使用this关键字(与输入方法的输入参数同名了);
  2. this调用本类中的其他方法,但通常this可以省略;
  3. this调用本类中的其他构造方法,调用时要放在构造方法的首行,this()方法可以为有参,也可以为无参(重载)。

总之,关键字this用于指代当前的对象。因此,类内部可以使用this作为前缀引用实例域以及方法(包括构造方法);


3. 类名.this :

类名.this一般用于内部类调用外部类的对象时使用,因为内部类使用this.调用的是内部类的域和方法,为了加以区别,所以使用类名.this来加以区分。例如以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class OuterClass {
    final String str = "OuterClass";
    private InnerClass innerClass;

    public InnerClass getInner() {
        innerClass = new InnerClass();
        return innerClass;

    }

    class InnerClass {
        final String str = "InnerClass";
        final String str2 = this.str;//指向内部类的域
        final String str3 = OuterClass.this.str;//指向外部类的域
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        InnerClass innerClass = outerClass.getInner();
        System.out.println(innerClass.str);
        System.out.println(innerClass.str2);
        System.out.println(innerClass.str3);
    }

}

控制台输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InnerClass
InnerClass
OuterClass

4.总结

组合

用法说明

this

指代当前对象的引用

类名.class

指向每个类对应的唯一类对象(类型为Class)

类名.this

内部(可以是匿名内部类)类调用外部类的对象时使用,即在内部类中使用时:外部类对象是外部类名.this,内部类对象则是this

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 反射机制下的内部类创建详解与实战
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2025/01/02
1410
Java 反射机制下的内部类创建详解与实战
【Java SE】类和对象
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。【百度百科】
xxxflower
2023/04/16
4690
【Java SE】类和对象
Java入门(10)-- 类的高级特性
在Java中每定义好一个类,通过Java编译器进行编译之后,都会生成一个扩展名为.class的文件,当程序的规模逐渐扩大时,就很容易发生类名冲突的现象,Java中提供了一种管理类文件的机制,就是类包。
爱学习的程序媛
2022/04/07
4260
Java入门(10)-- 类的高级特性
不清楚Java内部类的编译原理?读完这篇就够了
什么是内部类?我们将一个类A定义在另外一个类B中,那么这个类A就叫内部类。这是Java的一种非常有用的特性,它允许我们将“一些逻辑相关的类统一组织在一起,封装在内部,并控制类的可见性”。
后台技术汇
2022/05/28
4540
不清楚Java内部类的编译原理?读完这篇就够了
java学习之路:28.内部类(成员,局部,匿名,静态)以及继承
在一个类中使用内部类,可以在内部类中直接获取其所在类的私有成员变量。 成员内部类的语法如下:
花狗Fdog
2020/10/28
3950
java学习之路:28.内部类(成员,局部,匿名,静态)以及继承
四种内部类你都了解了吗?
小总结:在实例内部类中访问同名的成员变量时,优先访问自己内部类的,如果要访问外部类的同名成员变量,一定要使用外部类名.this.成员名
用户9996207
2023/01/13
2940
四种内部类你都了解了吗?
Java关键字(三)——static
  我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可以用类描述世间万物,也可以说万物皆对象。但是这里有个特殊的东西——static,它不属于对象,那么为什么呢?
IT可乐
2018/07/24
1K0
【Java 学习】:内部类详解
📃📃本文将通过Java内部类 是什么,为什么被广泛使用,以及又该如何去使用这三个方面来详细讲解其相关知识。
IsLand1314
2024/10/15
1320
【Java 学习】:内部类详解
JavaSE 基础学习之三 —— Java 的继承与接口
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ajianyingxiaoqinghan/article/details/80458729
剑影啸清寒
2019/05/26
5080
Java面向对象编程高级
在main方法中定义一个变量count,当一个小孩加入游戏后count++,最后个count 就记录有多少小孩玩游戏 。
timerring
2023/04/21
1.6K0
Java面向对象编程高级
Java提高篇——详解内部类
本文主要介绍了Java中的内部类相关知识点,包括内部类的定义、特点、使用方式以及局部内部类、匿名内部类和静态内部类的使用。同时,还讲解了Java中的局部变量和成员变量在使用上的一些区别,以及如何在方法中使用局部变量和成员变量。最后,还通过一个示例来演示了内部类的使用方式和应用场景。
Java后端工程师
2017/12/12
1.1K0
Java笔记
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 1.1.使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,使用内部类还能够为我们带来如下特性: (1)、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。 (2)、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。 (3)、创建内部类对象的时刻并不依赖于外围类对象的创建。 (4)、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。 (5)、内部类提供了更好的封装,除了该外围类,其他类都不能访问。
taoli
2022/09/30
2490
Java之static作用的全方位总结
 引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,那别人认为你还可以; 如果你说可以构成 静态内部类, 那别人认为你不错;如果你说了静态导包,
小勇DW3
2018/08/30
1.6K0
Java之static作用的全方位总结
「JAVA」从语法到案例,从定义到使用,详细解释Java 内部类的完全实现
Java 类中的可以定义的成员有:字段、方法、内部类,内部类是定义在类结构中的另一个类,因为定义在类的内部,故称为内部类。
老夫编程说
2020/05/13
8030
「JAVA」从语法到案例,从定义到使用,详细解释Java 内部类的完全实现
Java-面向对象
哈喽!大家好,我是小简。今天开始学习《Java-面向对象》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/04
1K0
Java-面向对象
Java语法糖(二)
  内部类:顾名思义,在类的内部在定义一个类。内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件。
在周末
2019/09/11
4370
Java 语言基础 (类和对象, 方法和封装, static 关键字和继承, 多态和特殊类)
ReturnType methodName(DataType... args) {}
RendaZhang
2020/09/08
8570
Java 语言基础 (类和对象, 方法和封装, static 关键字和继承, 多态和特殊类)
Java基础8:深入理解内部类
https://h2pl.github.io/2018/04/25/javase8
程序员黄小斜
2019/04/06
1.6K0
Java基础八股文第二弹
以下例子,Cat对象里面有个Person对象,调用clone之后,克隆对象和原对象的Person引用的是同一个对象,这就是浅拷贝。
程序员大彬
2022/07/08
7330
编程思想 之「接口、内部类」
在 Java 的语言体系中,类和接口是两种常见的定义对象的形式,内部类则是类的一种特殊形式。接口和内部类为我们提供了一种将抽象定义与具体实现相分离的更加结构化的方法。
CG国斌
2018/03/22
1.3K3
编程思想 之「接口、内部类」
相关推荐
Java 反射机制下的内部类创建详解与实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档