类名.class 类名.this 详解
原文链接:http://www.cnblogs.com/PengLee/p/3993033.html
类名.class
我们知道在java中,一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个Class类型的“类对象”,每个类都对应着一个这样的类对象,通过这个Class类型的类对象,我们就能够使用“内省与反射”机制,访问一个类的信息,比如:对应类中的方法有哪些,成员域有哪些等等;获取一个类的“类对象”的方法之一就是通过使用 类名.class 这个方式返回一个Class类型的对象,其他的获取这个Class对象的方法如下:
1). 利用对象调用getClass()方法获取该对象的Class实例
2). 使用Class的静态方法forName(),用类的名字获取一个Class实例
3). 运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。
以下是TestClass.java代码:
public class TestClass { public static void main(String[] args) { // 在运行期间,如果我们要产生某个类的对象,java虚拟机会检测该类型的Class对象是否已被加载。如果没有加载,java虚拟机会根据类的名称找到.class文件并加载它。 //当new Point()的时候加载这个类,用forName构造实例的时候也加载该类。 只加载一次 System.out.println("before new Point()"); new Point(); System.out.println("after new Point()"); try { Class.forName("Line"); } catch (Exception e) { e.printStackTrace(); } // 利用对象调用getClass()方法获取该对象的Class实例 Point pt = new Point(); Class c1 = pt.getClass(); System.out.println(c1.getName()); // 结果:Point // 使用Class的静态方法forName(),用类的名字获取一个Class实例 try { Class c2 = Class.forName("Point"); System.out.println(c2.getName()); // 结果:Point Point pp = (Point) c2.newInstance(); //一旦某个类型的Class对象已经被加载到内存,就可以用它来产生该类型的所有对象。 //newInstance()调用类中缺省的构造方法。 pp.output(); } catch (Exception e) { e.printStackTrace(); } // 运用.class的方式获取Class实例(类) Class c3 = Point.class; System.out.println(c3.getName()); // 结果:Point // 运用.calss的方式获取Class实例(基本类型) Class c4 = int.class; System.out.println(c4.getName()); // 结果:int // 运用.class的方式获取Class实例(基本数据类型的封装类) Class c5 = Integer.TYPE; System.out.println(c5.getName()); // 结果:int Class c6 = Integer.class; System.out.println(c6.getName()); // 结果:java.lang.Integer }
} class Point { static { System.out.println("loading point"); } void output() { System.out.println("x=" + x + ",y=" + y); } int x, y;
} class Line { static { System.out.println("loading Line"); }
}
类名.this
这个语法的应用主要有两个方面:
①当在一个类的内部类中,如果需要访问外部类的方法或者成员域的时候,如果使用 this.成员域(与 内部类.this.成员域 没有分别) 调用的显然是内部类的域 , 如果我们想要访问外部类的域的时候,就要必须使用 外部类.this.成员域
<pre name="code" class="java">public class TestA { public void tn(){ System.out.println("外部类tn"); } Thread thread = new Thread(){ public void tn(){System.out.println("inner tn");} public void run(){ System.out.println("内部类run"); TestA.this.tn();//调用外部类的tn方法。 this.tn();//调用内部类的tn方法 } }; public static void main(String aaa[]){new TestA().thread.start();} }
<span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;">②还有一个使用情况,那就是在是使用意图更加的清楚,在Android开发中我们经常要在一些地方使用 Context 类型的参数, 而这个参数我们往往使用this<br style="margin: 0px; padding: 0px;" /> 其实这里面其实有一种隐含的逻辑,比如我们定义一个Intent 或者一个TextView ,如 <br style="margin: 0px; padding: 0px;" /></span></span>
public class MainActivity extends Activity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(MainActivity.this , OtherActivity.class) ; }}
这说明我们创建的Intent 对象是与MainActivity这个类型的对象是有关联的,也就是说这个Intent是由MainActivity对象发出的,
好了, 这说明有些情况下虽然使用 类名.this 和 直接使用this 没有分别,但是使用 类名.this 却能够清楚的显示出一种关联性,因此值得提倡
与此同时如果我们创建的Intent在一个匿名内部类中创建的话,但是我们想让这个在Intent对象在逻辑上和外部类对象关联起来的话,我们就必须使用 外部类名.this 了
public class MainActivity extends Activity {private Button button;@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);this.button = (Button) this.findViewById(R.id.Button01); this.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, NextActivity.class); startActivity(intent); } }); } }
类名.class 类名.this 详解相关推荐
- 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- js模板字符串自定义类名_详解JavaScript ES6中的模板字符串
这篇文章主要介绍了详解JavaScript ES6中的模板字符串,JS的ES6版本带来诸多简洁化方面的重大改进,需要的朋友可以参考下 在 ES6 中引入了一种新的字符串字面量 - 模板字符串,除了使用 ...
- java 泛型 .net_Java基础11:Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...
- php开发面试题---php面向对象详解(对象的主要三个特性)
php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...
- 【C++】C++对象模型:对象内存布局详解(C#实例)
C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...
- PHP autoload机制详解
PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...
- MyBatis复习笔记2:配置文件详解
配置文件详解 属性(properties) MyBatis可以使用 properties 来引入外部 properties 配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或 ...
- Java单元测试之JUnit4详解
2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...
- 如何用JNI技术提高Java的性能详解
阻碍Java获得广泛应用的一个主要因素是Java程序的运行效率.Java是介于解释型和编译型之间的一种语言,同样的程序,如果用编译型语言C来实现,其运行速度一般要比Java快一倍以上.Java具有平台 ...
- struts2之配置文件struts.xml详解
struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version=" ...
最新文章
- Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译
- 解决导入.vdi文件时报“uuid is exists”错误
- 在高并发分布式情况下生成唯一标识id
- 20145220韩旭飞《网络对抗》Exp6 信息搜集与漏洞扫描
- 设计模式-观察者模式 实现
- 【Linux】39.nslookup查看域名与其对应的ip
- matlab fspeical,matlab的special函数用法
- python openpyxl读写xlsx_python高阶教程-python操作xlsx文件(openpyxl)
- python 指定gpu_加快Python算法的四个方法:Numba篇
- IMPLEMENT_DYNCREATE(CFileView, CView)
- Nobook虚拟实验室完爆各种传统实验室
- 局域网内计算机无法ping通,局域网内目标主机无法ping通怎么处理 局域网内目标主机无法ping通如何解决...
- idea运行web项目光标乱跳
- 龙卷风路径_龙卷风的目录
- iOS手机摄像头测心率
- ConcurrentLinkedQueue 源码解析(JDK8)
- javaWEB如何实现一个电影票预定购票系统javaee电影选票选座平台
- 3种不同脸型的瘦脸方法
- python使用百度aip文字识别
- 第七章 卷积神经网络2(代码实现)
热门文章
- Unity实战——模拟太阳系
- python众数问题给定含有n个元素的多重集合s_ACM题目:众数给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数...
- 安卓期末大作业——Android数独游戏
- Eclipse 注释乱码
- 惠勒延迟选择实验_肯·惠勒(Ken Wheeler)与开源软件的兴衰
- 网络安全保障之“三同步”
- linux路由器 性能测试工具,使用iperf测试路由器性能
- grequests并发之小试牛刀
- 2019年第十届山东省acm省赛总结
- word中目录出现省略号疏密不一致