第4章 类型转换和造型.docx
- 文档编号:10151255
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:31
- 大小:50.37KB
第4章 类型转换和造型.docx
《第4章 类型转换和造型.docx》由会员分享,可在线阅读,更多相关《第4章 类型转换和造型.docx(31页珍藏版)》请在冰豆网上搜索。
第4章类型转换和造型
第4章类型转换和造型
考点01基本数据类型的转换
规则01:
基本数据类型的转换是指由系统根据转换规则自动完成,不需要程序员明确声明不同类型数据之间的转换。
转换在编译期执行,而不是等到运行期再执行。
规则02:
基本数据类型的转换在赋值、方法调用和算术运算3种情况会发生。
方法调
用时数据转换是指调用方法向被调用方法传递参数,实参和形参类型不一致时会发生类型转换。
规则03:
赋值和方法调用的基本数据类型转换规则一样。
其合法的基本数据类型的转
char
换原则是指从取值范围窄的类型向取值范围宽的类型转换,如果是从取值范围宽的类型向取值范围窄的类型转换,则会产生编译错误。
图4-1给出了基本数据类型的转换顺序。
long
double
float
int
图4-1数据类型转换顺序
具体规则如下:
(1)布尔型(boolean)和其他基本数据类型之间不能相互转换;
(2)字节型(byte)可以转换为短整型(short)、整型(int)、长整型(long)、单精度型(float)和双精
度型(double);
(3)短整型(short)可以转换为整型(int)、长整型(long)、单精度型(float)和双精度型(double);(4)字符型(char)可以转换为字节型(byte)、短整型(short)或字符型(char)、长整型(long)、单精度型(float)和双精度型(double);
(5)整型(int)可以转换为长整型(long)、单精度型(float)和双精度型(double);
(6)长整型(long)可以转换为单精度型(float)和双精度型(double);
(7)单精度型(float)可以转换为双精度型(double);
(8)字节型(byte)不能转换为字符型(char);
(9)短整型(short)不能转换为字节型(byte)或字符型(char);
(10)字符型(char)不能转换为字节型(byte)或短整型(short);
(11)整型(int)不能转换为字节型(byte)、短整型(short)或字符型(char);
(12)长整型(long)不能转换为字节型(byte)、短整型(short)、字符型(char)或整型(int);
(13)单精度型(float)不能转换为字节型(byte)、短整型(short)、字符型(char)、整型(int)或长整型(long);
(14)双精度型(double)不能转换为字节型(byte)、短整型(short)、字符型(char)、整型(int)、长整型(long)或单精度型(float);
规则04:
Java语言中无后缀数字型数据共有两种默认类型,无小数点的整型数据默认类型为整型,带小数点的浮点数型数据的默认类型为双精度型。
规则05:
在赋值语句中,默认类型为整型的无小数点整型数据作为右操作数时,可以赋值给取值范围比整型小的变量,前提是数据对应的实际数值在变量类型的取值范围内。
默认类型为双精度型的带小数点的浮点型数据只能赋值给双精度型的变量,而不能赋值给单精度型变量。
规则06:
基本数据类型的转换在算术运算情况下,针对单操作数运算符和双操作数运
算符的转换规则是不一样的。
单操作数运算符在进行算术运算时的基本数据类型转换规则如下:
(1)当运算符为取正运算符(+)、取负运算符(-)或按位取反运算符(~)时,如果操作
数为字节型(byte)、短整型(short)或字符型(char),则先被转换为整型(int),再参与算术运算符;
(2)当运算符为自动递增运算符(++)或自动递减运算符(--)使如果操作数为字节型(byte)、短整型(short)或字符型(char),则不用先被转换为整型(int),而是直接参与算术运算,且运算结果类型也不变;
(3)如果操作数为整型(int)或长整型(long),则无论运算符为何种单操作数运算符,均不发生类型转换,直接参与算术运算,且运算结果类型不变;
双操作数运算符算术运算时的基本数据类型转换规则如下:
(1)如果操作数之一为双精度型(double),则另一个操作数先被转换为双精度型(double),再参与算术运算;
(2)如果两个操作数均不为双精度型(double),当操作数之一为单精度型(float),则另一个操作数先被转换为单精度型(float),再参与算术运算;
(3)如果两个操作数均不为双精度型(double)或单精度型(float),当操作数之一为长整型(long),则另一个操作数先被转换为长整型(long),再参与算术运算;
(4)如果两个操作数均不为双精度型(double)、单精度型(float)、或长整型(long),则两个个操作数先被转换为整型(int),再参与算术运算;
(5)如果采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换成目标变量的类型。
示例01:
给出以下代码,请问该程序的运算结果是什么?
1.publicclassExample{
2.privatefinalinti=10;
3.privatebytek=i;
4.publicstaticvoidmain(Stringargs[]){
5.System.out.println(k);
6.}
7.}
请选择一个正确答案:
(1)代码在第2行编译错误。
(2)代码在第3行编译时发出变量k不精确警告。
(3)代码编译成功。
(4)代码编译成功,但在运行期第5行抛出异常。
答案:
(2)
详解:
本题考查的核心是基本数据类型的转换。
选项
(2)正确,因为无法将一个取值范围大
的int型数据赋值给一个取值范围小的byte型变量,这样会存在数据丢失的可能性。
示例02:
给出以下代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
byteb=0;
b+=1;
System.out.println(b);
}
}
请选择一个正确答案:
(1)打印输出1。
(2)代码编译失败。
(3)在第4行的1前需要一个造型运算符(byte)。
答案:
(1)
详解:
本题考查的核心是基本数据类型的转换。
对于双操作数运算符在进行算术运算时会自动将两个运算数据的类型转换为取值范围较大的运算数的类型。
如果采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换成目标变量。
本示例中,尽管表达式b+1的结果类型为int型,但由于系统自动将int型结果转换为byte型,所以不会产生数据类型不兼容的编译错误。
示例03:
请问,以下哪些赋值语句正确?
请选择所有正确答案:
(1)floatfoo=-1;
(2)float0foo=1.0;
(3)float0foo=42el;
(4)float0foo=2.02f;
(5)float0foo=3.03d;
(6)float0foo=0x0123;
答案:
(1)(4)(6)
详解:
本题考查的核心是数据的赋值。
选项
(2)、(3)错误,因为1.0和42el均为带小数点的浮点型数据,其默认类型为双精度型,因此不能赋值给比双精度型取值范围小的单精度型变量。
同理,选项(5)错误,因为3.03d明确为一个双精度型值。
示例04:
请问,以下哪些语句无编译错误?
请选择所有正确答案:
(1)StringBuffersb1=”abcd”;
(2)Booleamb=newBooleam(“abcd”);
(3)byteb=255;
(4)intx=0x1234;
(5)floatf1=1.2;
答案:
(2)(4)
详解:
本题考查的核心是基本数据类型的转换。
选项
(1)错误,因为StringBuffer和String是两种字符,StringBuffer是可变字符类,即内容可改变,String类是不可变字符类,即一旦生成,其内容不可再改变。
选项(3)错误,因为255的默认类型为int型,不能直接赋值给取值范围小的字节型变量。
选项(5)错误,因为1.2的默认类型为double型,不能直接赋值给取值范围小的float型变量。
示例05:
请问,以下哪些语句实现了将数值5赋值给一个int型变量?
请选择所有正确答案:
(1)inttestValue=0x5;
(2)inttestValue=(int)(2.1F+3.4D);
(3)inttestValue=(octal)5;
(4)inttestValue=(0x0A>>1);
(5)inttestValue=(0x0A>>>1);
答案:
(1)
(2)(4)(5)
详解:
本题考查的核心是基本数据类型的转换。
选项(3)错误,因为强制转换是进行数据类
型之间的转换,不是进行进制之间的转换。
示例06:
请问,以下哪些语句无编译错误?
请选择所有正确答案:
(1)char=”c”;
(2)Booleanb=newBoolean(“qwerty”);
(3)strings=”null”;
(4)intq;
for(intp=0,q=0;p<5;p++){
System.out.println(“Val=”+p+q);
}
(5)intx=3;
floatf=newFloat(x);
答案:
(2)(3)(5)
详解:
本题考查的核心是基本数据类型的转换。
选项
(1)错误,因为Java语言中字符型数据
是用单引号括起来的一个字符,而用双引号括起来的是字符串,不管其含有几个字符。
选项
(2)正确,尽管布尔型数据只能取值true和false,但传入布尔型对应的封装类的
构造器中的参数可为任意字符串,对于不是true的其他字符串均视为false。
选项(4)
错误因为变量q声明了两次。
示例07:
给出以下代码,请问该程序的运行结果是什么?
1.classExample{
2.publicstaticvoidmain(Stringargs[]){
3.Booleanb=newBoolean(“abcd”);
4.floatf=123;
5.byteb=127;
6.intx=(int)(1.23);
7.shorts=128;
8.}
9.}
请选择一个正确答案:
(1)第3行发生编译错误。
(2)第4行发生编译错误。
(3)第5行发生编译错误。
(4)第6行发生编译错误。
(5)第7行发生编译错误。
(6)代码成功编译。
答案:
(6)
详解:
本题考查的核心是基本数据类型的转换。
选项(3)、(5)正确,因为数值数据均在目标
变量的取值范围内。
选项(4)正确,因为赋值尽管超出了目标变量的取值范围,但进行了明确的类型转换。
示例08:
给出以下代码,请问该程序的运行结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
float[][]fl={{1.2f,2.3f},{4.5f,5.6f};
Objectoo=fl;
fl[1][1]=oo;
System.out.println(“BestWishes”+fl[1][1]);
}
}
请选择一个正确答案:
(1)打印输出{4.5,5.6}
(2)打印输出4.5
(3)第5行发生编译错误。
(4)运行期异常。
答案:
(3)
详解:
本题考查的核心是类型兼容。
在本示例中,因为数组声明的类型是基本型float型,因此数组中所有元素的数据类型均为float型。
而在第5行中,将一个引用数组对象的引用变量赋值给数组中的fl[1][1]元素,自然会产生编译错误。
示例09:
给出以下代码,请问该程序的运行结果是什么?
1.classExample{
2.voidExample(inti){
3.System.out.println(“Int”);
4.}
5.
6.voidExample(Strings){
7.System.out.println(“String”);
8.}
9.
10.publicstaticvoidmain(Stringargs[]){
11.Examplet=newExample();
12.charch=’y’;
13.t.Example(ch);
14.}
15.}
请选择一个正确答案:
(1)第5行发生编译错误。
(2)第12行发生编译错误。
(3)第12行运行期抛出异常。
(4)打印输出Int
(3)打印输出String
答案:
(4)
详解:
本题考查的核心是基本数据类型的转换。
字符型在Java中其实质是一个无符号的16位整数。
在本示例中,将一个字符传进方法Example(inti)中不会产生编译错误,系统会自动将字符值转换为一个32位的int型值。
示例10:
给出以下代码,请问该程序的运行结果是什么?
1.classExample{
2.publicstaticvoidmain(Stringargs[]){
3.byteByte=10;
4.byteDouble=12;
5.byteInteger=Byte*Double;
6.}
7.}
请选择一个正确答案:
(1)打印输出120
(2)第3行发生编译错误。
(3)第5行发生编译错误。
(4)以上均不对。
答案:
(3)
详解:
本题考查的核心是基本数据类型的转换。
在Java中规定,对于二元运算符来说,如果
一个操作数的典型是float,double或long。
而另一个操作数转换为float,double或long。
否则两个操作数都被转换为int型。
在本示例中,先将两个操作数转换为int型,然后两数相乘,结果仍为int型。
把一个int型值赋予一个取值范围窄的byte型变量,会产生编译错误。
考点02 基本数据类型的造型
规则 01:
基本数据类型的造型是指程序员明确声明,需要把取值范围宽的类型转换为取值范围窄的数据类型。
如果没有使用明确的造型语句,则会发生编译错误。
造型是一种强制行为,尽管不会发生编译错误,但有可能发生数据截取,丢失数据信息的现象,造成得到和预期不一致的结果。
造型不是在编译期执行,而是等到运行期才执行。
规则 02:
基本数据类型的转换不会引起编译错误,它由系统自动完成。
造型在此时不是必须的,如果加上造型语句,可增强程序的可读性。
基本数据类型的造型规则如下:
⑴非布尔型的基本数据类型之间可以相互造型;
⑵布尔型和其他基本数据类型之间不能相互造型。
示例01:
给出以下代码,请问以下那些选项中的赋值语句需要明确造型?
请选择所有正确答案:
(1)myInt=myByte;
(2)myInt=myLong;
(3)myByte=3;
(4)myInt=myChar;
(5)myFloat=myDouble;
(6)myFloat=3;
(7)myDouble=3.0;
答案:
(2)(5)
详解:
本题考查的核心是基本数据类型之间的转换。
基本数据类型之间的转换,如果是从取值范围宽的类型向取值范围窄的数据类型转换,此种类型转换是非法的,会产生编译错误。
如果采用强制造型转换,则不会产生编译错误。
因为编辑器知道这种转换是存在危险的,但使用者依然还要继续执行。
选项
(2)、(5)属于将取值范围宽的数据向取值范围窄的变量赋值,为避免编译错误,必须采用造型运算符明确类型转换。
示例02:
给出以下代码,请问以下哪些是第2行的methodA()的有效返回值类型?
请选择一个正确答案:
(1)int
(2)double
(3)short
(4)float
答案:
(2)
详解:
本题考查的核心是基本数据类型之间的转换。
选项
(2)正确,因为表达式x/y*2的结果数据类型为double(因为参数y为double型,运算结果类型取范围较大者)型,尽管进行了强制转换,如果方法返回值类型声明为short型,则编译器会报数据精确丢失错误。
考点03引用类型的转换
规则01:
引用类型的转换是指由系统根据转换规则自动完成的,不需要由程序员明确声明不同引用类型数据之间的转换。
转换在编译期执行,而不是等到运行期再执行。
规则02:
引用类型的转换在赋值、方法调用两种情况下会发生。
注意,方法调用时因引用类型的转换是指调用方法向被调用方法传递参数,实参和形参型不一致时发生的类型转换。
规则03:
赋值和方法调用的引用类型转换规则一样,其合法的引用类型的转换原则是指一个子类的对象可以被一个超类的引用变量所引用。
其实质就是面向对象的继承概念,即该继承表达的就是新类(子类)属于现有类(超类)的一种类型。
这种上朔转换是肯定安全的,因为是一个更特殊的类型(子类)到一个更常规的类型(超类)。
换言之,子类是超类的一个超集,它可以包含比超类更多的方法,但至少包含了超类的方法。
因为Java语言中共有3种引用类型,分别为类、接口和数组,他们之间的转换存在9种可能性。
图4—2给出了这些可能的转换,其中Y表示可转换,N表示不能转换。
类型
被转换的类型
类
接口
数组
转换的目
标类型
类
Y
Y
Y
接口
Y
Y
Y
数组
N
N
Y
图4—2类、接口与数组转换
具体转换规则如下:
(1)类可以被转换为类或接口,但不能转换为数组。
如果转换为类,则转换的目标类必须是被转换类的超类。
如果转换为接口,则被转换类必须实现了转换的目标接口。
(2)接口可以被转换为类或接口,但不能转换为数组。
如果转换为类,则转换的目标类必须是Object类。
如果转换为接口,则转换的目标接口必须是被转换接口的超接口。
(3)数组可以被转换为类、接口或数组。
如果转换为类,则转换的目标类必须是Object类。
如果转换为接口,则转换的目标接口必须是Cloncable或Serializable接口。
如果转换为数组,则被转换数组的元素类型必须可以被转换为目标数组的元素类型。
示例01:
请问,以下那些表达式正确?
请选择所有正确答案:
(1)Objecto=newString(“abcd”);
(2)Booleanb=true;
(3)Panelp=newFrame();
(4)Appleta=newPanel();
(5)Panelp=newApplet();
答案:
(1)(5)
详解:
本题考查的核心是引用类型的转换,用类型转换的基本原则是指一个子类的对象可以被一个超类的引用变量所引用.在本示例中,选项
(1)正确,因为Object类是所有Java类的顶层类,因此可以将子类String对象赋予给Object变量.选项
(2)错误,因为变量b不是基本数据布尔型,而是一个对应的封装类boolean型变量,它是引用型变量,因此不能将基本数据值赋予它。
选项(3)错误,因为Panel类和Frame()类之间不存在继承关系,因此不能相互引用。
选项(4)错误、选项(5)正确,因为Applet类是Panel类的子类,因此可以将一个Applet类对象赋予给一个Panel类变量。
注意,反之赋值会产生编译错误。
示例02:
给出以下代码,请问该程序的运行结果是什么?
请选择一个正确答案:
(1)代码编译成功,运行期无异常。
(2)代码编译失败。
(3)代码编译成功,但运行器异常。
答案:
(2)
详解:
一个源文件最多只能包含一个顶层的public类定义。
示例03:
给出以下代码,请问该程序的运行结果是什么?
请选择一个正确答案:
(1)打印输出abcd和abcd
(2)代码编译失败,第3行发生错误。
(3)代码编译失败,第4行发生错误。
(4)代码编译失败,第6行发生错误。
答案:
(3)
详解:
本题考查的核心是引用类型的转换。
在本示例中,选项(3)正确,因为Object类是所有Java类的顶层类,因此只可以将子类String对象赋予给Object变量,而不能将其父类对象o赋值给子类变量s。
本示例中,经过执行第3行语句,变量o引用的已是一个字符串对象,如果将第4行语句改为Strings=(String)o,就可使代码成功通过编译。
示例04:
给出以下代码,请问该程序的运行结果是什么?
请选择一个正确答案:
(1)打印输出
ShowmethodinExampleclass
ShowmethodinSubclass
ShowmethodinSubclass
ShowmethodinSubclass
(2)打印输出
ShowmethodinExampleclass
ShowmethodinSubclass
ShowmethodinExampleclass
ShowmethodinExampleclass
(3)打印输出
ShowmethodinExampleclass
ShowmethodinSubclass
ShowmethodinExampleclass
ShowmethodinSubclass
(4)代码编译失败。
答案:
(4)
详解:
本题考查的核心是引用类型的转换。
在本示例中,尽管变量e引用的对象是子类实例,但在表达式s=e行处,在没有明确造型为子类的前提下,直接把一个父类变量赋予其子类变量,会因违反造型规则,产生编译错误。
正确语句应为s=(Sub)e;。
示例05:
给出以下代码,请问插入哪条语句可以打印输出Sub?
请选择一个正确答案:
(1)System.out.println(b.getFields());
(2)System.out.println(b.name);
(3)System.out.println((Base)b.getFields());
(4)System.out.println((Sub)b).getFields());
答案:
(4)
详解:
本题考查的核心是引用类型的转换。
在本示例中,子类Sub的一个实例可以赋值给父类Base型变量b。
为了使用子类Sub中定义的getFields()方法,又需要把类型为父类Base型变量b造型成子类。
如果没有造型,像选项(1)中所示直接调用getFields()方法,此时是从父类中去寻找getFields()方法,而不是调用子类中定义的getFields()方法。
考点04 引用典型的造型
规则 01:
引用类型的造型是指程序员根据造型规则明确进行不同引用类型数据之间的转换。
如果没有使用明确的造型语句,就会发生编译错误。
由于引用变量存储的不是对象本身,而是对象的内存地址,因此引用类型的造型实际上分两步进行,一是在编译期执行的语法检查,二是等到运行期,根据实际传递对象的类型才执行的转换,因此就有可能编译通过。
运行时,因实际传递对象的类型无法转换而导致异常抛出。
基本数据类型的造型不会发生此种编译
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 类型转换和造型 类型 转换 造型