Class类和Class实例

Class类和Class实例

 

张三、李四两个对象

class  Person{

//张三、李四共同的具备的行为(方法)和状态(字段)

}

Person就是张三、李四这两个对象的类型,即是张三李四两个对象的描述

一切皆对象,那么person、Date、String...又是什么类型呢?--Class,即都是Class类的对象,都由Class类来描述

Class的实例是什么?--就应该是类或接口【更严格的说是java中的字节码(类或接口编译后生成的.class文件)】

Class类:用于描述一切类或接口

Class实例:就是JVM中的一份字节码(一个类或接口)  (枚举是一种类、注解是一种接口)

 

问题:那Class实例到底表示的是哪一份字节码(或者哪一个类或接口)?

Class  clz1=Date.class;

Class  clz2=String.class;

为了明确区分出Class实例表示的是谁的字节码,Class类提供了泛型!!

上面两个示例中,是省略了泛型的写法------第一个示例的clz1表示的是Date的字节码,Date.class的类型就是Class<Date>;第二个示例的clz2表示的是String的字节码,String.class的类型就是:Class<String>

(上面的写法会出现编译警告)

实例化时无法确定所表示的字节码类型时通常使用通配符?或者T,上面的两个示例可以写为下面的方式:

 

Class<Date>  clz1=Date.class;//不会出现编译警告

Class<String>  clz2=String.class;

或者使用通配符:

Class<?>  clz1=Date.class;//不会出现编译警告

Class<?>  clz2=String.class;

 

public void demo(Class<?>  clazz);

泛型通配符?(或者T):表示的是当前所表示的字节码类型-----?是在实例化时无法确定所表示的字节码类型时使用的,通配所有类型

 

 

 

Class类中没有字段、显示构造器

如何得到Class的实例?------有三种方式

1、数据类型.class-------就是一个字节码

2、静态方法forName(String  className);----Class.forName(String  className);-----根据一个类的全限定名来构建Class对象,该方法会抛出ClassNotFoundException异常---注意必须是全限定名才能获得对应实例

3、对象.getClass();----------每个对象都有该方法,因此该方法定义在Object类中----返回的是该对象的真实类型,即运行时类型

Object obj=new Date();

Obj的编译是类型Object

obj.toLocalString();//toLocalString是Date类的方法,代码在编译阶段去编译类型Object中检查是否有该方法,如没有,编译失败;–这条语句会在编译阶段报错 

反射可以解决:

Class  clz=obj.getClass();//等价于Class<Date>  clz=obj.getClass();  通常写法:Class<?>  clz=obj.getClass();--------此时的?表示的时obj的运行时类型,即Date类型

clz.toLocalString();//正确

 

一个类或接口在Java虚拟机(JVM)中,有且只有一份字节码

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Scala中,有两种主要的定义方式:case classclass。 1. Case Class: Case class是一种特殊的,用于定义不可变的数据模型。它们通常用于模式匹配、复制对象和比较对象等场景。以下是case class的特点: - 自动生成伴生对象:在定义case class时,Scala会自动生成一个伴生对象,其中包含apply方法和unapply方法等。这使得我们可以直接使用名创建对象,而无需显式调用构造函数。 - 自动生成toString、equals和hashCode方法:case class自动为所有字段生成toString、equals和hashCode方法,这使得我们可以方便地比较和打印对象。 - 不可变性:case class实例是不可变的,即不能修改字段的值。 - 模式匹配:case class经常与模式匹配结合使用,可以根据对象的属性进行分析和操作。 2. Class: Class是一般的定义方式,用于创建可变或不可变的对象。以下是class的特点: - 需要手动定义伴生对象:在定义class时,需要手动定义一个伴生对象,并在其中编写apply方法等。这样才能像case class一样使用名创建对象。 - 可变性:class实例可以是可变的,即可以修改字段的值。 - 需要手动实现toString、equals和hashCode方法:与case class不同,class需要手动实现这些方法,以便进行对象的比较和打印。 总结: - Case class适用于定义不可变的数据模型,并且提供了许多自动生成的方法和模式匹配的支持。 - Class适用于更通用的定义,可以是可变的或不可变的,并且需要手动实现一些方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值