类名.class

     我们知道在java中,一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个Class类型的“类对象”,每个类都对应着一个这样的类对象,通过这个Class类型的类对象,我们就能够使用“内省与反射”机制,访问一个类的信息,比如:对应类中的方法有哪些,成员域有哪些等等;获取一个类的“类对象”的方法之一就是通过使用   类名.class  这个方式返回一个Class类型的对象,其他的获取这个Class对象的方法如下:

1). 利用对象调用getClass()方法获取该对象的Class实例
2). 使用Class的静态方法forName(),用类的名字获取一个Class实例
3). 运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。

以下是TestClass.java代码:

    1. public class TestClass {
    2. public static void main(String[] args) {
    3. // 在运行期间,如果我们要产生某个类的对象,java虚拟机会检测该类型的Class对象是否已被加载。如果没有加载,java虚拟机会根据类的名称找到.class文件并加载它。
    4. //当new Point()的时候加载这个类,用forName构造实例的时候也加载该类。 只加载一次
    5. System.out.println("before new Point()");
    6. new Point();
    7. System.out.println("after new Point()");
    8. try {
    9. Class.forName("Line");
    10. } catch (Exception e) {
    11. e.printStackTrace();
    12. }
    13. // 利用对象调用getClass()方法获取该对象的Class实例
    14. Point pt = new Point();
    15. Class c1 = pt.getClass();
    16. System.out.println(c1.getName()); // 结果:Point
    17. // 使用Class的静态方法forName(),用类的名字获取一个Class实例
    18. try {
    19. Class c2 = Class.forName("Point");
    20. System.out.println(c2.getName()); // 结果:Point
    21. Point pp = (Point) c2.newInstance(); //一旦某个类型的Class对象已经被加载到内存,就可以用它来产生该类型的所有对象。
    22. //newInstance()调用类中缺省的构造方法。
    23. pp.output();
    24. } catch (Exception e) {
    25. e.printStackTrace();
    26. }
    27. // 运用.class的方式获取Class实例(类)
    28. Class c3 = Point.class;
    29. System.out.println(c3.getName()); // 结果:Point
    30. // 运用.calss的方式获取Class实例(基本类型)
    31. Class c4 = int.class;
    32. System.out.println(c4.getName()); // 结果:int
    33. // 运用.class的方式获取Class实例(基本数据类型的封装类)
    34. Class c5 = Integer.TYPE;
    35. System.out.println(c5.getName()); // 结果:int
    36. Class c6 = Integer.class;
    37. System.out.println(c6.getName()); // 结果:java.lang.Integer
    38. }
    39. }
    40. class Point {
    41. static {
    42. System.out.println("loading point");
    43. }
    44. void output() {
    45. System.out.println("x=" + x + ",y=" + y);
    46. }
    47. int x, y;
    48. }
    49. class Line {
    50. static {
    51. System.out.println("loading Line");
    52. }
    53. }

类名.this

这个语法的应用主要有两个方面:

①当在一个类的内部类中,如果需要访问外部类的方法或者成员域的时候,如果使用  this.成员域(与 内部类.this.成员域 没有分别) 调用的显然是内部类的域 , 如果我们想要访问外部类的域的时候,就要必须使用  外部类.this.成员域

package com.test;
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();}
}
②还有一个使用情况,那就是在是使用意图更加的清楚,在Android开发中我们经常要在一些地方使用 Context 类型的参数, 而这个参数我们往往使用this
其实这里面其实有一种隐含的逻辑,比如我们定义一个Intent 或者一个TextView ,如

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详解的更多相关文章

  1. 类名.class 与 类名.this 详解

    类名.class 与 类名.this 详解 今天在看 PropertyPlaceholderConfigurer 源码时,突然看到一个 PropertyPlaceholderConfigurer.th ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  4. css选择器的使用详解

    -.css选择器的分类: 二.常用选择器详解: 1.标签选择器: 语法: 标签名 { 属性:属性值; } 代码示例: h1 { color: #ccc; font-size: 28px; } 2.类选 ...

  5. C#中的 特性 详解(转载)

    本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...

  6. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  7. java分享第十五天(log4j 格式详解)

    log4j 格式详解  log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...

  8. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  9. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  10. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

随机推荐

  1. bzoj 1411 [ZJOI2009]硬币游戏

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1411 [题意] N个硬币放在一个有2*N个位置的圆桌上,求T次操作后的情况.对于一个操 ...

  2. Node与Express开发 坑1

    添加 app.set('views', __dirname + '/views') 修改 app.use(express.static(__dirname + '/public')); express ...

  3. 浅析Netty的异步事件驱动(一)

    本篇文章着重于浅析一下Netty的事件处理流程,Netty版本为netty-3.6.6.Final. Netty定义了非常丰富的事件类型,代表了网络交互的各个阶段.并且当各个阶段发生时,触发相应的事件 ...

  4. HIbernate学习笔记(五) 关系映射之一对多与多对一

    三.       多对一 –单向 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和 ...

  5. [C++]VS与第三方工具下载

    名称:Qt 5.1.1 (商业版与开放源码许可GPL/LGPL) 说明:Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架 下载:http://www.qt.io/downl ...

  6. A Tour of Go Function values

    Functions are values too. 在函数式语言中中函数都是变量,比如在javascript中 package main import ( "fmt" " ...

  7. input输入密码变黑点密文

    input输入密码加密 html代码 <form id="login-form" method="post" onsubmit="return ...

  8. Oracle- 查询误删数据

    使用flashback table能恢复误删数据. flashback table CONTAINER_CONTENT to timestamp to_timestamp('2010-06-30 22 ...

  9. CentOS6.5安装telnet

    原文地址:http://www.cnblogs.com/zhongshengzhen/ 1.检查是否已经安装telnet [root@localhost ~]# rpm -qa | grep teln ...

  10. 理解 auto_ptr<T>

    1.auto_ptr<T>解决什么问题? 在堆上获取的资源,客户可能会忘记delete,或者由于异常没有执行到delete,导致资源泄漏.在栈上分配的对象,有个特点,不论出现什么情况,超出 ...