转自: http://www.cnblogs.com/PengLee/p/3993033.html

类名.class与类名.this详解

 

类名.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);

}

});

}

}

转:java 类名 this 的使用的更多相关文章

  1. Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)

    需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现   反射的过程如下:     第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...

  2. Java 类名.class与类名.this 的区别?

    “类名.this”的语法在Java语言中叫做“qualified this”.相关规定在这里:Chapter 15. Expressions - Qualified this这个语法的主要用途是:在内 ...

  3. java 类名.class、object.getClass()和Class.forName()的区别 精析

        1.介绍 getClass()介绍 java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类: Object类中有getClass()方法,通过这个方法就可以获得一个实 ...

  4. Java类名.class和getClass()区别

    区别 类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定. getclass()运行时根据实际实例确定,getClass()是动态而且是final的. Strin ...

  5. Java类名 方法名 常量 变量的命名习惯

    1.包 用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名,对于包名,每个字母都需要小写. 如果定义类的时候没有使用package(包),那么java就认为我 ...

  6. java 类名.this

    类名为this的限定词. 相对于内部类:有多个this: 1.内部类本身的this: 2.内部类的环境类的this: 类名.this,就是为了对这些this指针的指向做出限定. 区别于类名.class ...

  7. java 类名后加变量名是什么意思?

    回答这个问题我们需要先了解两个事情: A是一个类,我们如果对他进行实例化,需要这样写: A a = new A(); 详细解释一下这个语句,首先等号左边做的事情:在JVM栈内存(stack)中定义了一 ...

  8. Java学习笔记(05)

    目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...

  9. java web学习总结(三十一) -------------------EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

随机推荐

  1. HDU 5828 Rikka with Sequence (线段树)

    Rikka with Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  2. labview 中activex的初步使用方法

    1.在前面板放置一个activex容器 2.插入activex控件 3.百度找到这个activex控件的属性和方法介绍 4.程序框图中右键activex控件,创建xxx类的方法或者xxx的属性:act ...

  3. Contest 7.21(贪心专练)

    这一次都主要是贪心练习 练习地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#overview Problem APOJ 13 ...

  4. CodeForces 705B Spider Man (水题)

    题意:给定 n 个数,表示不同的环,然后把环拆成全是1,每次只能拆成两个,问你有多少次. 析:也不难,反正都要变成1,所以把所有的数都减1,再求和即可. 代码如下: #pragma comment(l ...

  5. hdu 4763 Theme Section(KMP水题)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. Spring MVC Framework 实例

    一 SpringMVC基础入门,创建一个HelloWorld程序 1 首先,导入SpringMVC需要的jar包. commons-logging-<version>.jar spring ...

  7. C#编程简短总结

    封装 field一般为private,定义的时候可以不赋值.不赋值的时候一般被构造函数初始化赋值,其值用来保存类实例的数据,可以被内部方法使用作为计算的数据来源.当需要继承类继承本类的时候,field ...

  8. st_Alarm_GenAlarmDealTime

    USE [ChiefmesNew]GO/****** Object: StoredProcedure [dbo].[st_Alarm_GenAlarmDealTime] Script Date: 04 ...

  9. 如何在Visual Studio中选择C++和C#的编译器版本

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Visual Studio中选择C++和C#的编译器版本.

  10. 文件频繁IO能有多大的差别

    测试文件写同样大小的文件,单次记录较小和单次记录较大能有多大的性能差别. 最终写入同样大小的文件,小记录需要写入10w次,大记录需要写入1w次,看下最终的性能报告