当前位置: 首页 > news >正文

广州建设网站怎么做如何开发微信小程序开发

广州建设网站怎么做,如何开发微信小程序开发,山西电商网站开发,合肥网站优化服务网目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、什么是泛型 三、引出泛型 1、泛型的语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 六、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类…

 

目录

一、包装类 

1、基本数据类型和对应的包装类

2、装箱和拆箱

3、自动装箱和自动拆箱

二、什么是泛型

三、引出泛型

1、泛型的语法

四、泛型类的使用

1、语法

2、示例

3、类型推导(Type Inference)

六、泛型如何编译的 

1、擦除机制

2、为什么不能实例化泛型类型数组

七、泛型的上界

1、语法

2、示例

八、泛型方法

1、定义语法

2、示例


一、包装类 

Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

1、基本数据类型和对应的包装类

 除了 Integer Character, 其余基本类型的包装类都是首字母大写。


2、装箱和拆箱

简单的说,装箱就是:自动将基本数据类型转换为包装器类型;拆箱就是:自动将包装器类型转换为基本数据类型。

int i = 10;
// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);
// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();

3、自动装箱和自动拆箱

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。
int i = 10;
Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱
int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

从字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法,而在拆箱的时候自动调用的是Integer的intValue方法。

其他的比如Double、Character等也是类似的,大家可以自己动手尝试一下。


因此可以用一句话总结装箱和拆箱的实现过程:

装箱过程是通过调用包装器的valueOf( )方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。

现在,我们来看一道题,试着思考下列代码的输出结果是什么:

public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);}

答案是:true  false

这是因为,在Integer这个包装类中,它所能存储的数值的范围是在 -128~127 之间的,而 a、b 均在这个范围内,因此比较a和b的时候比较的是数值的大小,此时a == b,因此输出true。

但是 c 和 d 均超出了Integer所能的范围,因此此时为了存储 c 和 d ,会自动new对象来分别存储它们,此时也就相当于我们比较的是引用类型, 因此在c  == d 这个比较中比较的是它们的地址,从而导致输出结果为false


二、什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
                                                                                      ----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

三、引出泛型

现在,我们有这么一个任务:
实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?
那么此时我们该如何实现这段代码呢?思路如下:
思路:
1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];
2. 所有类的父类,默认为Object类。数组是否可以创建为Object?

那么此时,便会有这么一段代码:

class MyArray {public Object[] array = new Object[10];public Object getPos(int pos) {return this.array[pos];}public void setVal(int pos,Object val) {this.array[pos] = val;}
}
public class TestDemo {public static void main(String[] args) {MyArray myArray = new MyArray();myArray.setVal(0,10);myArray.setVal(1,"hello");//字符串也可以存放String ret = myArray.getPos(1);//编译报错System.out.println(ret);}
}

通过以上代码实现后我们会发现一下几个问题:

1. 任何类型数据都可以存放
2. 这段代码会发生报错,这是因为ret字符串是String类型的,但是myArrary这个数组却是Object类型的,因此我们需要对其进行强制转换。
虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

1、泛型的语法

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数}

那么此时,我们利用泛型就可以将之前的那段代码改成这个样子:

class MyArray<T> {public T[] array = (T[])new Object[10];//1public T getPos(int pos) {return this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}
}
public class TestDemo {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();//2myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);//3System.out.println(ret);myArray.setVal(2,"Hello");//4}
}

现在,我们对代码进行一下分析:

1. 类名后的 <T> 代表占位符,表示当前类是一个泛型类
除此之外,我们还可以了解一个常见的规范:
【规范】类型形参一般使用一个大写字母表示,常用的名称有:

 2. 不能new泛型类型的数组

那么这也就意味着:

T[] ts = new T[5];//是不对的
3. 类型后加入 <Integer> 指定当前类型
4. 不需要进行强制类型转换
5. 代码编译报错,此时因为在注释2处指定类当前的类型,此时在注释4处,编译器会在存放元素的时候帮助我们进行类型检查。

四、泛型类的使用

1、语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

2、示例

MyArray<Integer> list = new MyArray<Integer>();
这里我们的第二个<>里面的Integer是可以省略的,也就是说,我们可以将代码改成这个样子:
MyArray<Integer> list = new MyArray<>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!


3、类型推导(Type Inference)

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写
MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer
小结:
1. 泛型是将数据类型参数化,进行传递
2. 使用 <T> 表示当前类是一个泛型类。
3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换。

六、泛型如何编译的 

1、擦除机制

那么,泛型到底是怎么编译的?泛型本质是一个非常难的语法,要理解好他需要一定的时间打磨。
现在,我们来通过命令:javap -c 查看字节码文件,所有的T都是Object。

 在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制

Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
其它有关泛型擦除机制的文章介绍:https://zhuanlan.zhihu.com/p/51452375

2、为什么不能实例化泛型类型数组

我们先来看这么一段代码:

class MyArray<T> {public T[] array = (T[]) new Object[10];public T getPos(int pos) {return this.array[pos];}public void setVal(int pos, T val) {this.array[pos] = val;}public T[] getArray() {return array;}public static void main(String[] args) {MyArray<Integer> myArray1 = new MyArray<>();Integer[] strings = myArray1.getArray();}
}

此时代码会进行报错:

关于报错的原因,通俗讲就是:返回的Object数组里面,可能存放的是任何的数据类型,可能是String,可能是Person,运行的时候,直接转给Integer类型的数组,编译器认为是不安全的。

现在,我们来看一下正确的方法【了解即可】

class MyArray<T> {public T[] array;public MyArray() {}/*** 通过反射创建,指定类型的数组* @param clazz* @param capacity*/public MyArray(Class<T> clazz, int capacity) {array = (T[])Array.newInstance(clazz, capacity);}public T getPos(int pos) {return this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}public T[] getArray() {return array;}
}
public static void main(String[] args) {MyArray<Integer> myArray1 = new MyArray<>(Integer.class,10);Integer[] integers = myArray1.getArray();}

七、泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

1、语法

class 泛型类名称<类型形参 extends 类型边界> {
...
}

2、示例

public class MyArray<E extends Number> {
...
}

这段代码表示只接受 Number 的子类型作为 E 的类型实参

MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型

那么当我们没有指定E的边界的时候,又该怎么判断范围呢?

没有指定类型边界 E,可以视为 E extends Object

八、泛型方法

1、定义语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

2、示例

public class Util {//静态的泛型方法 需要在static后用<>声明泛型类型参数public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}
}

http://www.yayakq.cn/news/96806/

相关文章:

  • 建网站要服务器网站开发+搜索
  • 北京学习网站建设南昌外贸网站建设
  • 如何在淘宝上做自己的网站手机免费建网站
  • 学编程好找工作吗?泉州关键词优化推广
  • 在淘宝上做代销哪个网站好怎么开个人工作室
  • 网站赚钱平台优区生活app官方下载
  • 两学一做专题教育网站网页设计与制作背景图片
  • 腾讯空间个人认证 企业认证 网站认证哪种功能用途最齐全??大蒜做营销型网站
  • 上线了自助建站公司做网站费用计入什么科目
  • 森东网站建设深圳设计周
  • 南通网站建设排名网易云音乐网页版
  • 心理咨询网站如何构建个人网站
  • 做外贸哪个网站最容易上手天津网站开发平台
  • seo优化外包公司seo快排优化
  • phpmysql网站开发技术什么网站做app好
  • 机械网站建设价格国家企业信息系统公示系统下载
  • dw软件网站建设教程视频站酷设计网站首页
  • 营销型网站的特点企业域名注册费用
  • 无锡百度网站排名seodao cn
  • 深圳网站制作可选兴田德润衡阳房产网
  • 专业做淘宝网站绍兴dede视频网站模板
  • 黄山网站建设怎么做楼盘网站建设方案ppt
  • 做淘宝导购网站整站优化费用
  • 做外贸网站的价格无锡工程建设中心网站
  • 在线设计海报的网站ui设计做兼职的网站有哪些
  • 怎样申请网站空间wordpress撰写
  • 整站排名优化公司企业手机网页设计
  • 网站集约化建设的目的黄页网大全免费软件
  • 元隆盛建设集团有限公司网站wdcp wordpress伪静态
  • 帝国网站管理系统安装教程做旅游网站的目的与意义