基本数据类型、包装类与String三者之间的转换(自然类型转换和强制类型转换)以及引用类型的强制类型转换以及自动拆装箱问题

八种基本数据类型:byte、short、int、long、float、double、char、boolean

boolean类型不能与数值间相互转化

        数值与数值之间的相互转化:

在程序运行的时候,我们经常需要将一种数值类型转化为另一种数值类型,下图给出了合法转化(自动类型转换):

 虚线代表转化可能会出现精度丢失。

上面是小类型转为大类型,大类型自然而然可以装下小类型。而想把int转为byte时,也就是大类型转为小类型时就需要强转了。例:(数值运算有自动提升机制会把类型变为默认的int类型,想转回来就需要强转)

int a=10;

byte c=(byte) a;//新数据类型 名称=(新数据类型)原数据名

强制转换可能会产生数据丢失。 

对应的包装类分别为:

byteshortintlongfloatdoublecharboolean
ByteShortIntegerLongFloatDoubleCharacterBoolean

基本数据类型变为其对应的包装类需要装箱,java可以自动装箱

包装类转换为对应的基本数据类型需要拆箱,java可以自动拆箱

 我们以int、Integer、String为例,写出他们三者之间转化的语句;

1)int=>Integer        Integer a=new Integer(primitive);/Integer a=primitive(自动装箱写法)

2)Integer=>int                int a = Integer对象.xxxValue();/int a=对象名(自动拆箱)

3)Integer=>String                String str = Integer对象名.toString();强转

4)String=>Integer                Integer a = new Integer(String str);强转

5)int=>String                String str = String.valueOf(primitive);装箱

6)String=>int                int a = Integer.parsexxx(str);拆箱

引用类型的强制类型转换: 

如下两个类,一个User父类和一个继承于User的Student子类

public class User {
    private int age;
    private String name;
      
    public int getAge(){
        return this.age;
    }

     public String getName(){
        return this.name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public void setAge(String name){
        this.name = name;
    }
}

 

public class Student extend User{
    private int age;
    private String name;
    private String schoolName;
      
    public int getAge(){
        return this.age;
    }

     public String getName(){
        return this.name;
    }

    public String getSchoolName(){
        return this.schoolName;
    }

    public void setAge(int age){
        this.age = age;
    }

    public void setAge(String name){
        this.name = name;
    }

    public void setSchoolName(String schoolName){
        this.schoolName= schoolName;
    }
}

在main方法中如下初识化 一个实例:

 User user = new Studtnt();

如果我们想调用子类的方法getSchoolName(), 我们创建的对象是无法调用的,我们需要进行类型强转:

Student stu = (Student) user 

这样stu就可以调用子类的方法了,这里是使用了引用类型的强制转换 

自动拆装箱 :

为什么会有包装类:

  • 不符合面向对象思想,基本类型不是对象
  • 涉及到集合时基本类型用不了(list、map),需要包装类完成
  • 可以使用基类存在的方法
  • 但是会占用更大内存

自动拆装箱: 

编译器行为

自动装箱是在编译Integer a = 3时会自动调用装箱方法Integer.valueOf(3) 

自动拆箱是在编译int b = a 时会自动调用拆箱方法a.intValue()

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sshm_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值