Copyright©Stonee

在Java中,无论是类还是接口,它们在JVM的内存逻辑模型中都会存在Super和Class指针,分别指向根类(Object类)和反射类(Class类)
在这一篇blog中会了解到很多常用方法,建议大家看api

1. 位置和内容

  • Object类和Class类都位于 java.lang. 包中,使用时均无需导入
  • 我们可以在jdk或者IDE甚至是官方文档中找到,当然,也可以利用reflect类中的方法写个小程序来找到他们的内容(一会有讨论)
public class java.lang.Object
{public java.lang.Object();protected void finalize();public final native void wait(long);public final void wait(long, int);public final void wait();public boolean equals(java.lang.Object);public java.lang.String toString();public native int hashCode();public final native java.lang.Class getClass();protected native java.lang.Object clone();public final native void notify();public final native void notifyAll();private static native void registerNatives();
}

关于class的就不再详细列出

2. Object类

Object类是每个类的始祖,Java中的任何一个类都是由Object类扩展而来,但不用写class a extends Object,无论是否指出,Object都被认为是此类的直接超类或间接超类。所以任何类都可以调用Object类中方法

基本操作
    1. 使用Object的变量引用各种类型的方法:Object obj = new A();
    1. 同时,当一个函数的形参是 object 的话,就说明可以传递object的子类,即任意一种类,具体可以参考我的另一篇博客,Java中用Object实现任意参数
    1. 通过强制类型转换来实现子类的具体操作: A a = (A) obj;但是需要注意,这种向下转型极有可能出错:

如下

Object obj = new A();
A aa = (A) obj;     //正确Object obj = new B();
A ab = (A) obj;     //错误

相信大家可以看到,向下转型的条件必须是父类指向转型类的实例

常用方法

在平时编写子类的时候,经常要重写Object中的几个方法,如下:

  • public boolean equals(Object obj)

底层的实现过程为:

public boolean equals(Object obj) {   return (this == obj);
}

检测两个对象是否具有相通的引用,其中“==”比较的是地址值。下面是一个重写的例子:

class a {private int a;public a( int a){this.a = a;}public boolean equals(a obj){return this.a == obj.a;}
}
  • public native int hashCode();

在Java应用程序执行期间,无论何时在同一个对象上多次调用它,hashCode方法都必须始终返回相同的整数,前提是不修改对象上等号比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不必保持一致。
如果根据equals(Object)方法,两个对象是相等的,那么在每个对象上调用hashCode方法必须产生相同的整数结果。
但是并没有强制要求如果equals()判断两个对象不相等,那么它们的hashCode()方法就应该返回不同的值。

  • public String toString()

底层实现为:

public String toString() {   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Object中的toString返回的是:包名+类名+@+对象hashCode的16进制。所以当我们需要将派生类中进行字符串转换时,也需要重写toString方法

  • public final native Class<?> getClass();

取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象

3. Class类

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。

  • 注意Class和class
  • 类没有公共构造函数。相反,当类装入器调用某个defineClass方法并传递类文件的字节时, 类对象由Java虚拟机自动构造
获得Class类对象的几种方法

假设 a 为一个类对象,则获得a的类对象:

  • Class c = a.getClass()
  • Class c = Class.forName(a) 但是由于传入的a可能不是类实例,所以此处应提供一个异常处理器,否则会抛出checkedexception异常
  • Class c = int.class; 注意,int需要先自动装箱,使用这种办法生成Class类对象时,不会使JVM自动加载该类(如Integer类)。而其他办法会使得JVM初始化该类。
使用Class类的对象来生成目标类的实例
  • 动态创建类实例
    Class c = Class.forName(a); Object aInstance=obj.newInstance();

4. 附:通过反射类查找类中具体的字段和方法的java程序

package chapter05;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;/*** This program uses reflection to print all features of a class* @version 1.0 2019-04-7* @author stonee(http://www.stonee.club)*/public class ReflectionTest {public static void main(String [] args){//read class name from command line args or user inputint flag = 1;String name;    //class nameScanner input = new Scanner(System.in);while(flag == 1){if (args.length > 0)    //from command line argsname = args[0];else{   //from user inputSystem.out.println("Enter class name (e.g. java.util.Date) : ");name = input.next();}try {//print class name and superClass nameClass c1 = Class.forName(name);     //get classClass superC1 = c1.getSuperclass();     //get superClassString modifiers = Modifier.toString(c1.getModifiers());    //get the "public" to stringif (modifiers.length() > 0)System.out.print(modifiers + " ");  //print the "public"System.out.print("class " + name);  //print the class nameif (superC1 != null && superC1 != Object.class)System.out.print(" extends " + superC1.getName());  //print the superClass if haveSystem.out.print("\n{\n");  //print "{"printConstructors(c1);System.out.println();printMethods(c1);System.out.println();printField(c1);System.out.println("}");}catch (ClassNotFoundException e){e.printStackTrace();}//System.exit(0);System.out.println("Do you wanna go on this program ?(1 or 0)");flag = input.nextInt();}}/*** prints all constructors of a class* @param c1 a class*/private static void printConstructors(Class c1){Constructor [] constructors = c1.getDeclaredConstructors(); //返回这个类或接口所有共有方法,不包括继承for (Constructor c:constructors) {String name = c.getName();System.out.print("  ");String modifiers = Modifier.toString(c.getModifiers());    //get the "public" to stringif (modifiers.length() > 0)System.out.print(modifiers + " ");  //print the "public"System.out.print(name + "(");// print parameter typesClass [] paramTypes = c.getParameterTypes();for (int i = 0; i < paramTypes.length; i++){if (i > 0)System.out.print(", ");System.out.print(paramTypes[i].getName());}System.out.println(");");}}private static void printMethods(Class c1){Method[] methods = c1.getDeclaredMethods();for (Method m:methods) {Class retType = m.getReturnType();  //得到返回值String name = m.getName();System.out.print("  ");//print modifiers, return type and method nameString modifiers = Modifier.toString(m.getModifiers());    //get the "public" to stringif (modifiers.length() > 0)System.out.print(modifiers + " ");  //print the "public"System.out.print(retType.getName() + " " + name + "("); //打印方法的返回值和方法名//print the parameter typesClass [] paramTypes = m.getParameterTypes();for (int i = 0; i < paramTypes.length; i++){if (i > 0)System.out.print(", ");System.out.print(paramTypes[i].getName());}System.out.println(");");}}private static void printField(Class c1) {Field[] fields = c1.getDeclaredFields();for (Field f :fields) {Class fType = f.getType();  //得到返回值String name = f.getName();System.out.print("  ");//print modifiers, return type and method nameString modifiers = Modifier.toString(f.getModifiers());    //get the "public" to stringif (modifiers.length() > 0)System.out.print(modifiers + " ");  //print the "public"System.out.print(fType.getName() + " " + name + ";" ); //打印方法的返回值和方法名System.out.println();}}
}

Java中的Object类和Class类相关推荐

  1. Java中的Type接口和Class类区别和联系

    Java中的Type接口和Class类有什么区别 Type是Class的父接口. Type 是 Java 编程语言中所有类型的公共高级接口.它们包括原始类型.参数化类型.数组类型.类型变量和基本类型. ...

  2. java在dog中定义name变量,组合构造 冯跃峰 java中组合的应用(不相干的类共同完成一个功能)+构造器回顾...

    java中组合的应用(不相干的类共同完成一个功能)+构造器回顾:今天我们了解到java的组合.可以说java组合是非常的重要的.可以对类进行封装,将底层的内容封装起来.甚至于java的继承都没有其重要 ...

  3. java 中成员变量的名字和类的方法的名字可以一样.

    java 中成员变量的名字和类的方法的名字可以一样. public class fourone {public static void main(String[] args) {int first[] ...

  4. java 中操作字符串都有哪些类?它们之间有什么区别?

    java 中操作字符串都有哪些类?它们之间有什么区别? String.StringBuffer.StringBuilder String : final修饰,String类的方法都是返回new Str ...

  5. thrift如何定义Java中的object类型

    目录 thrift如何定义Java中的Object类型 方法一:使用联合(union) 方法二:使用特殊类型(binary) 终极方法:序列化 thrift如何定义Java中的Object类型 由于t ...

  6. Java中的Object类 是什么?JSONObject 又是什么?

    背景 有时候我们在定义数据结构的时候,比如List,HashMap等等,因为我们不知道提前装在里面的是什么,所以我们可以先定义它为Object的数据类型,形如控制器的代码如下,那什么是Object类, ...

  7. Java中的Object类

    文章目录 一. Object类简介 二. Object类的常用方法 toString方法 equals方法 其他相关方法详解 一. Object类简介 Object类是Javajava.lang包下的 ...

  8. Java中的Object类的toString()方法,equals()方法

    Object类是所有类的父类,若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法: 1.toString 如果输出一个对象的时候 ...

  9. java object数组转实体类_详解Java中String JSONObject JSONArray List实体类转换

    JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: "com.alibaba", name: "fastjson&quo ...

最新文章

  1. mysql5.7用declare声明失败_我可能会失败,但我不会一直失败。
  2. 你为什么“啃不动”你手中的技术书?
  3. webform 控件上面能写 前端事件吗_详细的网易前端秘籍—如何准备面试
  4. 原文:我的数据库学习“曲线”
  5. 修改el-popover和el-select样式
  6. 三星5nm产品开发进度出问题,高通紧急向台积电求援
  7. “Jupyter的杀手”:Netflix发布新开发工具Polynot
  8. Java面向对象封装和继承
  9. [原创]使用 Google Chart 在线服务实现软件版本发布时间线图
  10. 恩智浦智能车电机驱动程序_恩智浦智能车电机驱动-HIP4082+LR7843
  11. Ubuntu18.04 上 ESP8285 的 esp-at release_v2.2.0.0 编译环境搭建
  12. 桌面计算机恢复出厂设置,电脑桌面恢复出厂设置
  13. KT6368A蓝牙转HID键盘_蓝牙ibeacon模块方案测试板使用说明
  14. BladeX框架源码分析--00、包结构
  15. 纪念我的小宝贝——浪浪
  16. 【搬家】VB.NET开发全功能串口调试助手
  17. Unable to find image ‘yt:latest‘ locally
  18. 如何运用Microsoft Office Project 2003来做项目计划
  19. [Netty]pipeline(二)
  20. 2022-2027年中国半导体整流设备市场竞争态势及行业投资前景预测报告

热门文章

  1. 为什么网站服务器不存在了,最可能的原因: 指定的目布医无名录或文件在 Web 服务器上不存在...
  2. 使用GeoServer 发布切图服务
  3. 白岩松:平静才是真正的奢侈品。
  4. PNPOLY - Point Inclusion in Polygon W. Randolph Franklin
  5. 保护眼睛,开启浏览器的夜间模式 顺便学下!important的作用
  6. 磁共振t1t2信号记忆顺口溜_医学影像分割入门、MRI、t1、t2等序列概念
  7. SAP成都研究院小伙伴们2018~2019两年间的179篇原创文章合集
  8. 为什么要用频谱分析仪测量频谱?
  9. python 开发环境的搭建
  10. 转:车规芯片的AEC-Q100测试标准