Object,T,?的区别以及具体含义

1 篇文章 0 订阅
1 篇文章 0 订阅

最近公司组织java基础技术分享,我就选择此话题进行分享.

讲解顺序如下:

1,object类的解释.

2,object的运用.

3,JDK1.5之后 泛型的解释

4.通配符?

5.区别


内容虽多, 因解释详细,容易理解,耐心看完你会发现另一片天地!

如有帮助就顶一下,如有自己的看法和意见,就发表评论,大家一起学习,莫要吝啬哦!


开干!!!


1.Object类:

java.lang包在使用的时候无需显示导入,编译时由编译器自动导入。

  Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类。

  Object类是Java中唯一没有父类的类。

  其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。

2.Object运用:

如果你方法参数存在object,那么就意味这你的参数范围很广,同时也会使你的方法变的更加灵活,因为object是所有类的父类.例如:

public List<Object> getListO(Object ob){

List<Object> list = new ArrayList<>();

list.add(ob);

return list;

}

这样当你调用该方法的时候传什么参数都可以,

优点:使代码变得更通用

缺点:往往需要转型,效率低,容易产生错误

(向上选转型是没有风险的, 但是在向下转型的时候就存在风险,如果转型失败就会抛出异常ClassCastException),例如:

public void test(){

String str="asd";

List<Object> list = getListO(str);

Object ob = list.get(0);

//如果此时Integer i=(Integer)list.get(0);就会抛异常.原因是我在list集合中添加的是String类型的数据

String st = (String) list.get(0);

}


3.泛型的解释:

Java泛型编程是JDK1.5版本后引入的。泛型让编程人员能够使用类型抽象,通常用于集合里面。

泛型的本质便是类型的参数化,通俗的说就是用一个变量来表示类型,这个类型是不确定,但是仅仅是表示某个类型

3.1定义泛型类如下:

classTest<T>{

private T t;

Test(T t){

this.t=t;

}

public T getT(){

return t;

}

public void setT(T t){

this.t=t;

}

}

3.2定义泛型方法如下:

 public <T> List<T> getlistT(T t){
List<T> list = new ArrayList<>();
list.add(t);
return list;

* 泛型参数类型声明必须在返回类型之前

public void test() {
String str = "1111";
 List<String> getlistT = getlistT(str);
 String string = getlistT.get(0);

在编译的时候就已经的确定类型,所以不需要强转,不存在转型风险

3.3 误区

3.3.1不能创建参数化类型的数组

3.3.2不能实例化类型变量,及不能出现以下的类似代码

T t= new T();或者 T.class

3.3.4不能再静态域或方法中出现参数类型

private static T t;

public static void test(){

action about T...

}

3.4优点:

3.4.1.泛型可以把使用Object的错误提前到编译后,而不是运行后,提升安全性

3.4.2.增强程序可读性,稳定性和效率

3.5 类型擦除的由来

在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定则使用Object.

3.6.泛型限定

泛型限定是通过?(通配符)来实现的,表示可以接受任意类型,那一定有人有疑问,那?和T(二者单独使用时)有啥区别了,其实区别也不是很大,仅仅在对参数类型的使用上。

public void printDif(ArrayList<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext(){
Object ob = it.next();
System.out.println(it.next());
}
}
public <T> void printDifT(ArrayList<T> al){
   Iterator<T> it = al.iterator();
   while(it.hasNext()){
       T t = it.next();  
       System.out.println(t);
   }
}

//区别就在此处,T可以作为类型来使用,而?仅能作为接收任意类型(Object)

*jdk 1.5/1.6 必须显式的写出泛型的类型。

*jdk 1.7/1.8 不必显式的写出泛型的类型。

4.通配符?

通配符是一个有趣的东西,如果你掌握了,会使你的代码更为通用(健壮性更强)。

4.1 通配符的几种形式:

      4.1.1无限定通配符,<?>

      4.1.2上限通配符,<?  extends  test>。表示参数类型只能是Number的子类。

      4.1.3下限通配符,<?  super test>。表示参数类型只能是Number的父类。

?如果使用extends,super就能将范围缩小 ,使用泛型、通配符提高了代码的复用性。

上面已经定义了一个?方法了,就不在举例 了,很多东西其实还的靠自己去思考的

5.区别

5.1 ?和object相似,但具体说,?会比object更细致化一些.

 5.2在定义泛型对象的使用方法时,还不知道T是什么类型,它可能是String类型,也可能是Integer类型。

如果,把T定义成一个确定的泛型数据类型,参数就只能是这种数据类型。此时,就用到了通配符代替确定的泛型数据类型。

 5.3 把一个对象分为声明、使用两部分的话。泛型侧重于类型的声明上代码复用,通配符则侧重于使用上的代码复用。

泛型用于定义内部数据类型的不确定性,通配符则用于定义使用的对象类型不确定性。


到这里就介绍完object,T,?,以上是自己的理解和所查资料的总结,哪里说的不对可以进行评价(即使回复的).

在唠叨一下,如果有所帮助就顶一下.莫要吝啬哦!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值