首页 > 编程语言 >Java学习之四:“this”和“类名.this”以及“类名.class”的区分和详解

Java学习之四:“this”和“类名.this”以及“类名.class”的区分和详解

时间:2023-04-25 15:32:57浏览次数:46  
标签:InnerClass Java String 对象 class 之四 Class 类名


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

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

1.1 Class类简介:
Class类只有私有的构造方法,所以不能使用new关键词来创建一个Class对象;只有JVM虚拟机可以创建一个类对象,且是在类加载的时候被调用的。
运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象,和其名字相同的类对象名。
每个数组属于被映射为 Class 对象的一个类,所有具有相同类型和维数的数组都共享该 Class 对象。只不过数组对象的名字比较奇怪
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
1.2 得到类对象的三个方法:
虽然我们不能使用构造器得到Class对象,但是却可以通过其他方法得到:(注意,class对象可以是接口)
我们先创建一个对象,比如: String类: String str = new String("Hello World");

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

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

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

 

try {
             Class classOfString2=Class.forName("java.lang.String");
             System.out.println(classOfString2);
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }


注意事项:

forNanme()方法会抛出异常ClassNotFoundException,所以需要使用try-catch语句捕获。
forName方法输入参数为类名,而不是对象名,并且要完整写出类路径,否则会抛出异常
方法3:通过类名.class返回此类对象(非静态方法):
Class classOfString3=String.class;

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

1.3 Class类的常用方法:
getName()
其原理上调用了一个本地私有方法的非静态方法,返回String类型的实例,代表Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
newInstance()
此方法用于返回一个类对象的实例,实例构造只能无参构造器,且为弱类型(即Object类型)。
例子:

try {
                 String s =(String) classOfString.newInstance();
         }     catch (InstantiationException e) {
                 e.printStackTrace();
             }     catch (IllegalAccessException e) {
                 e.printStackTrace();
         }


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

getClassLoader()
返回该类的类加载器。
getComponentType()
返回表示数组组件类型的 Class。
getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
isArray()
判定此 Class 对象是否表示一个数组类。
2. this关键词:
this关键字的三大应用:

this调用本类中的属性,也就是类中的成员变量,例如:set和构造器中经常使用this关键字(与输入方法的输入参数同名了);
this调用本类中的其他方法,但通常this可以省略;
this调用本类中的其他构造方法,调用时要放在构造方法的首行,this()方法可以为有参,也可以为无参(重载)。
总之,关键字this用于指代当前的对象。因此,类内部可以使用this作为前缀引用实例域以及方法(包括构造方法);

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

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);
     }}


控制台输出:

InnerClass
InnerClass
OuterClass
4.总结
组合    用法说明
this    指代当前对象的引用
类名.class    指向每个类对应的唯一类对象(类型为Class)
类名.this    内部(可以是匿名内部类)类调用外部类的对象时使用,即在内部类中使用时:外部类对象是外部类名.this,内部类对象则是this

标签:InnerClass,Java,String,对象,class,之四,Class,类名
From: https://blog.51cto.com/u_16081664/6224151

相关文章

  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • JavaWeb回顾与小结(二)
    AjaxAjax介绍概念AsynchronousJavaScriptAndXML,异步的JS和XML作用数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术原生Ajax准备数据地址创建XMLHttpRequest对象:......
  • java把word文件流转为pdf并下载优化篇
    上一篇方法虽然能用,但是样式会乱,目录也会丢失。故搜集了多篇博客终于找到了优化版本不会丢失目录,也不会丢失任何东西,样式也能源文件保留首先这个需要下载一个jar包,链接已放自行下载链接:https://pan.baidu.com/s/1viRWwiEOdgLUwb9VxZb8RQ?pwd=m4xu 提取码:m4xu然后放在系统根目......
  • 【❀Java虚拟机】对象终止机制
    什么是对象终止机制?Java语言提供了对象终止( finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑处理。当垃圾回收器发现没有任何引用指向某个对象时,那么就会在垃圾回收中清除这个对象,在垃圾回收器回收此对象之前,会先调用这个对象的 finalize()方法。我们......
  • (二) Java开发细节
    目录Java开发注意事项和细节说明Java开发注意事项和细节说明Java源文件以.java为扩展名.源文件的基本组成部分是类(class).publicclassHello{ //编写一个main方法 publicstaticvoidmain(String[]args){ System.out.println("hello,world~");//分号表示语句结......
  • (一) 认识Java与Java安装
    目录Java运行机制Java编译运行Java开发细节JavaJDKJava运行机制java语言的特点:跨平台性编译后的java程序可以在不同的操作系统上运行,依靠的是不同平台的JVMJava核心机制-Java虚拟机(JVMjavavirtualmachine)JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域,......
  • java ui 自动化
    1、依赖<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.14.0</version></dependency>2、Chrome驱动下载......
  • 【HarmonyOS】自定义组件之JavaUI实现通用标题栏组件
    【关键字】标题栏、常用内置组件整合、JavaUI、自定义组件 【1、写在前面】平时我们在开发一个应用时,我们都知道一个完整的项目中会有很多个页面,而这些页面中会有许多通用的部分,比如通用标题栏、通用Dialog、通用下拉菜单等等,在Android开发中我们可以通过LayoutInflater.from......
  • java将word文件流转为pdf并下载
    1.pom<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</g......
  • 在JavaScript的if判断中,关于数组Array的相关思考
    结论:在if判断中,无法直接使用Array转Boolean的方法判断数组是否为空数组letarray=[];//中间进行N步操作之后//...if(array){ console.log("数组为空数组");}if(array==[]){ console.log("数组为空数组");}if(array==0){ console.log("数组为空数组");}if(array......