「引用类型的转换java」类的类型转换可以使用
本篇文章给大家谈谈引用类型的转换java,以及类的类型转换可以使用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java中的引用数据类型是怎样的?
- 2、java中的强制类型转换
- 3、java 强制类型转换的规则是什么?
- 4、java中引用数据类型与类定义的数据类型能相互转化吗
- 5、java编程引用类型分析?
- 6、java引用类型强制转换, 类型是什么意思,转换的是什么,有什么作用?
java中的引用数据类型是怎样的?
java中有两种数据类型:基本类型和引用类型。\x0d\x0a基本类型有8个:\x0d\x0a 整数类型 byte、short、int、long\x0d\x0a 浮点数类型 float、double\x0d\x0a 字符型 char\x0d\x0a 布尔类型 boolean\x0d\x0a引用类型包括三种:\x0d\x0a 类 Class\x0d\x0a 接口 Interface\x0d\x0a 数组 Array\x0d\x0a基本类型是通过诸如 int a = 5; long b = 6L;的形式来定义的,称为自动变量,自动变量存放的是字面值,不是类的实例,它存放在内存的堆栈中,数据大小和生存期必须是确定的,存取速度比较快,在堆栈中的字面值可以共享,也就是说我们定义一个int a = 5;然后又定义了一个int b = 5;这时a与b在内存中指向的是同一个字面常量。\x0d\x0a引用类型一般是通过new关键字来创建,比如Integer num = new Integer(3);它存放在内存的堆中,可以在运行时动态的分配内存大小,生存期也不必事先告诉编译器,当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收走。引用变量中存放的不是变量的内容,而是存放变量内容的地址。\x0d\x0a在参数传递时,基本类型都是传值,也就是传递的都是原变量的值得拷贝,改变这个值不会改变原变量,而引用类型传递的是地址,也就是参数与原变量指向的是同一个地址,所以如果改变参数的值,原变量的值也会改变。这点要注意。\x0d\x0a在java中,8种基本类型在java中都有对应的封装类型,也就是引用类型:\x0d\x0a 整数类型 Byte、Short、Integer、Long\x0d\x0a 浮点数类型 Float、Double\x0d\x0a 字符型 Character\x0d\x0a 布尔类型 Boolean\x0d\x0a有时候我们会看到这样的语句 Integer num = 3;Boolean b = true;这样定义也能行得通,其实这里面有一个自动装箱的问题,即java自动把3这个字面常量封装成了Integer对象,同理也有自动拆箱。\x0d\x0a还有些需要注意的比较特殊的地方:\x0d\x0a1.Integer类型\x0d\x0aInteger i1 = 3;\x0d\x0aInteger i2 = 3;\x0d\x0a此时i1 == i2 返回的是true\x0d\x0aInteger i1 = 128;\x0d\x0aInteger i2 = 128;\x0d\x0a此时i1 == i2返回的是false,\x0d\x0a这时因为Integer的数值在-128~127之间时,即在int的范围内,默认是按照基本类型int来存放的,仍旧存在堆栈中,如果超出了int的范围,就按照对象的方式来存放和比较了。\x0d\x0a \x0d\x0a2、String类型\x0d\x0aString类型我们有时候也会直接这样定义:\x0d\x0aString s = "abc";\x0d\x0a这里的"abc"称为字符串常量,也是存在堆栈中的,s中存放的就是指向这个堆栈地址的引用,如果再定义一个\x0d\x0aString s1 = "abc";\x0d\x0a这时,s与s1存放的是同一个地址的引用,即s与s1指向的是同一个字符串常量,\x0d\x0as == s1的值是true,\x0d\x0a但是如果有\x0d\x0aString s2 = new String("abc");\x0d\x0a这时s == s2则为false,因为使用new之后,每次生成的对象都不是同一个,即使存储的内容相同。\x0d\x0a上面的s == s1,s == s2其实比较的都是地址,并不是里面的内容。如果要比较内容,可以使用equals()方法。\x0d\x0a\x0d\x0a其他的就不多说了,打起来太慢了,可以自己去看一下java编程思想。
java中的强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换。
在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。
当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。
举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:
Father father = new Son();
在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!
Son son = (Son)father;
这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。
前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:
Father father = new Father();
Son son = (Son) father;
这个系统会抛出ClassCastException异常信息。
所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。
所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。
扩展资料:
public class TestCastClassException
{
public static void main(String[] args)
{
Father father = new Son();
//这两句话是不对的,因为一个father类型的引用(指针)是看不见、看不到son中新定义的数据成员或者成员函数的
//虽然这个对象的本质是Son类型的,它也确实有这样的数据成员和成员函数,但是指针的作用范围不够,它看不到。
//代码后面附上模型分析
//father.son = 2;
//father.show_son();
father.show_father();
father.show();
Father father1 = (Father)father;//一个对象在内存中被new出来后,只能选择访问它的方式,不能修改它的布局(包含的成员的个数等)
father1.show();
} //main
}
class Father
{
public int father = 2;
Father(){}
void show()
{
System.out.println("This is father");
}
void show_father()
{
System.out.println("father!!");
}
}
class Son extends Father
{
public int son = 1;
Son(){}
void show()
{
System.out.println("This is son");
}
void show_son()
{
System.out.println("son!!");
}
}
java 强制类型转换的规则是什么?
1、执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等等;
2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;
3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参;
4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。
扩展资料
C++中强制类型转换函数有4个:
1、const_cast(用于去除const属性)。
2、static_cast(用于基本类型的强制转换)。
3、dynamic_cast(用于多态类型之间的类型转换)。
4、reinterpreter_cast(用于不同类型之间的指针之间的转换,最常用的就是不同类型之间函数指针的转换)。
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。
在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。
在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回。
参考资料
百度百科-强制类型转换
java中引用数据类型与类定义的数据类型能相互转化吗
java中的数据类型分为两大类:基本数据类型和引用数据类型
基本数据类型,包括数值型,字符型和布尔型。
数值型:1)整型:byte 1个字节;short 2个字节;int 4个字节;long 8个字节。
2)浮点型:float 4个字节;double
8个字节;可以采用十进制和十六进制两种表示方式,其中十六进制表示方法只能采用科学计数法,例如:0x1.2p3,表示的是的是1乘以16加上2乘以16的-1次方的和乘以2的三次方;浮点型的默认类型为DOUBLE型,如果声明float型浮点数,要在数值后面加上f或F,例如:float
f1 = 3.14F;否则会报精度错误。
字符型:char 采用unicod的16位编码方式进行编码。
布尔型:true,false;
引用数据类型:类、接口类型、数组类型、枚举类型、注解类型;
基本数据类型和引用数据类型的区别主要在存储方式上:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被床架时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
例如:我有一个类MyDate,其中有属性day,mouth,year等,有构造方法(带参数);
现在为其创建一个对象MyDate d1 = new
MyDate(8,8,2008);
在内存中的具体创建过程是:
1)首先在栈内存中位其d1分配一块空间;
2)然后在堆内存中为MyDate对象分配一块空间,并为其三个属性设初值0,0,0;
3)根据类MyDate中对属性的定义,为该对象的三个属性进行赋值操作;
4)调用构造方法,为三个属性赋值为8,8,2008;(注意这个时候d1与MyDate对象之间还没有建立联系)
5)将MyDate对象在堆内存中的地址,赋值给栈中的d1;通过句柄d1可以找到堆中对象的具体信息。
呵呵,引用数据类型的创建还真是挺复杂的一个过程。。。
java编程引用类型分析?
我们在使用java编程开发语言开发软件的时候通常都会new对象,然后通过对对象的引用来实现不同的编程需求,而今天电脑培训就一起来了解一下,java编程开发语言中都有哪些常见的引用方法。
1:虚引用
1.1简介:虚引用是所有引用中强度弱的,它完全类似于没有引用,在java.reflact.PhantomReference类中实现。虚引用对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象存在虚引用,那么它和没有引用的效果大致相同,虚引用无法引用任何堆中的对象
作用:虚引用主要用于跟踪对象被JVM垃圾回收的状态,可以通过它来手机GC的行为。可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用锁引用的对象是否被回收。
注意:虚引用无法单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用.被虚引用所引用对象被垃圾回收后,虚引用将被添加到引用队列中。
2:弱引用
简介:弱引用和虚引用有点类似,不同之处在于虚引用锁引用的对象生存期比虚引用长一点。虚引用在java.reflact.WeakReference类实现。在系统进行垃圾回收的时候,不管系统内存是否足够,总是回收该对象所占用的内存.但是弱引用的强度是要大于虚引用的
3:软引用
简介:软引用比弱引用的强度高一点,它是通过java.reflact.SoftReference来实现。对于软引用来说,当系统内存空间足够时,它不会被系统回收,程序中改对象的引用也是有效的。而当系统的内存空间不够时,系统将会回收它。
作用:软引用是强引用好的替代,它一定程度上可以避免系统内存不足的异常,可以充分使用软引用来解决内存紧张的问题。
4:强引用
简介:强引用很常见,在平时的程序中,我们新new一个对象,比如Objectobject=newObject();那么这个object就是指向object对象的强引用。强引用的特点就是:被引用的java对象绝对不会被垃圾回收机制回收,即使系统的内存非常紧张,即使java以后也用不到,jvm不会回收强引用所引用的java对象。
java引用类型强制转换, 类型是什么意思,转换的是什么,有什么作用?
在JAVA中类型,可以认为是类。。。。。转换就是一个类的实例,转成另一个类的实例——在可以的情况下。
~~~~~~~~~~
关于引用类型的转换java和类的类型转换可以使用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-09,除非注明,否则均为
原创文章,转载请注明出处。