1.Java的数据类型分为三大类

  布尔型,字符型和数值型

    其中数值型又分为整型和浮点型

2.Java的变量类型

  布尔型 boolean

  字符型 char

  整型    byte,short,int,long

  浮点型 float,double

3.数据类型转换

  Java中数据类型转换分为三种,简单数据类型转换,字符串与其他类型转换,其他实用数据类型转换

  (1)简单数据类型转换

    在Java中,整型,实型,字符型被视为简单数据类型。

    这些类型级别从低到高:(byte,short,char)-> int -> long -> float -> double

    从低级变量到高级变量那是自动类型转换,从高级变量到低级变量那是强制类型转换,包装类过渡类型转换

  (2)低级变量可以直接转换为高级变量

  如:byte b;

    int i=b;

    float f=b;

    如果低级类型为char型,向高级类型(整型)转换时,会转换成对应的ASCII码值

  如:char c='c';

    int i=c;

    输出i的结果是:99

    对于byte,short,char三种类型而言,它们是相同级别的,不能相互转换,可以使用强制类型转换

  如:short i=99;

    char c=(char)i;

    输出c的结果是:c

  (3)强制类型转换

    int i=99;

    byte b=(byte)i;

  (4)包装类过渡类型转换

    Java的包装类就是可以直接将简单类型的变量表示为一个类,Java共有6个包装类,分别是Boolean,Character,Integer,Long,Float,Double

    包装类到底有什么作用?

    在进行简单数据类型转换时,可以利用包装类进行中间过渡。一般情况下,首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换。

  如:当希望把float型转换为double型

    float f1=100.00f;

    Float F1=new Float(f1);

    Double d1=F1.doubleValue();

  (5)字符串与其他数据类型的转换

    几乎所有的java.lang.Object类派生的所有类都提供了toString()方法,就是可以将该类转换成字符串。

  如:int f1=3.14f;

    Float F1=new Float(f1);

    String sf1=F1.toString();

栗子:给出以下代码,请给出结果.

class Two{
Byte x;
}
class PassO{
public static void main(String[] args){
PassO p=new PassO();
p.start();
}
void start(){
Two t=new Two();
System.out.print(t.x+””);
Two t2=fix(t);
System.out.print(t.x+” ” +t2.x);
}
Two fix(Two tt){
tt.x=42;
return tt;
}
}

  结果是:null,42,42

  注意:x是包装类Byte,引用类型!不是基本类型byte。实例该类对象时,如果成员变量没有显示初始化那么Java默认初始化为null.

  该题中引用类型t作为形参进行传递,形参的改变会改变实参的值,所以再次打印t.x时已经变为42了。

  在java中,基本类型的初始化都为0,boolean初始化为false,类的初始化都为null。
  本题中Two的属性x是Byte类型,是byte的包装类,是类,所以初始化后该属性的值为null,而非0。
  本题中fix()方法的参数是引用传递而非值传递,对tt进行修改后,原参数对象的值也进行改动。

4.+能使类型提升

  如:指出以下程序的错误之处:

    short s=1;

    s=s+1;

  原因是,s+1为int,不能赋值给short。

栗子1:

  boolean b=true?flase:true == true?false:true;

  结果是:false

  原因:(1)三目运算符是右结合性的,(2)==的优先级比 ? : 都高,所有要先算,

      true?flase:((true == true)?false:true)

      之后就是true?flase: (true ?false:true ) -->flase?false:false --> false

栗子2:

   int a=5;

   System.out.println("value is"+((a<5)?10.9:9));

  结果是:9.0

  原因:Java会根据运算符的精度类型进行自动类型转换。由于前面一个是10.9,那么后面的9就会自动变成9.0

栗子3:(重要)

  布尔逻辑与(&)和逻辑与(&&),布尔逻辑或(|)和逻辑或(||)的区别

  特点:凡是&&前面是false,那么&&后面的表达式就不用再做了。||前面的是true,||后面的就不用再做了。

     但是无论运算符&、| 前面的是true,还是false,运算符后面的表达式都的继续进行运算。

  如:int m=n=5;

    if((m!=5)&&(n++=5)){}

    System.out.println(n);//结果是5,因为&&前面的是false,&&后面的就不用做了

    int m=n=5;

    if((m!=5)&(n++=5)){}

    System.out.println(n);//结果是6

    int m=n=5;

    if((m==5)||(n++=5)){}

    System.out.println(n);//结果是5,因为||前面是true,后面的就不用做了

    int m=n=5;

    if((m==5)|(n++=5)){}

    System.out.println(n);//结果是6

5.传值与传引用

 不管Java参数的类型是什么,一律传递参数的副本。如果是传值,那么传递的是值的副本;如果Java是传引用,那么传递的是引用的副本。

  (1)对于基本类型变量而言,传值就是把自己复制一份传递,即使自己的副本变了,自己也不变。

  (2)对于对象类型而言,它传递的引用副本指向自己的地址,而不是自己实际值的副本。

    为什么要这么做呢?

    因为对象类型是放在堆里的,一方面,速度相对于基本类型比较慢,另一方面,对象类型本身比较大,如果采用重新复制对象值的办法,浪费内存且速度慢。

  (3)String类型也是对象型变量,所以它必然传引用副本。

  Java中的引用到底是什么?

  Person person=new Person("张三");

  这个person就是一个引用,是引用变量,保存了它所指向的对象的在堆中的地址。它是存在栈中的,指向新创建的Person对象。

栗子1:

public class Test{
public static void test (StringBuffer str){
str.append(",world!");
}
public static void main(String[] args){
StringBuffer string =new StringBuffer("Hello");
test(string);
System.out.println(string);
}
}

  运行结果是:Hello,World!

  这里的string是一个引用,Java对于引用形式传递对象类型的变量时,实际上是将引用作为一个副本传进方法函数的。那么这个函数里面的引用副本所指向的是什么?是对象的地址。

  通过引用副本(复制的钥匙)找到地址(仓库)并修改地址中的值,也就修改了对象。(但是这样的引用副本有时效性,函数结束,钥匙销毁。)可以理解为,张三拿一把复制的钥匙,进了仓库,在仓库改变了很多东西,那李四拿着另外一把钥匙打开这个仓库,这个仓库还是那个仓库,里面的东西肯定改变了。

栗子2:

public class Test{
public static void test (String str){
str="world";
}
public static void main(String[] args){
String string ="Hello";
test(string);
System.out.println(string);
}
}

  运行结果是:Hello

  str="world";隐含着让Java生成一个新的String对象。当执行str="world";时,其过程为:首先系统会自动生成一个新String对象,并把这个新对象的值设为"world",然后把这个引用赋给str(可以理解为str这把钥匙原来指向"Hello"这个仓库,但是现在要求str这把钥匙重新指向"world"这个仓库。),所以既然对象是新的,那就与原来的"Hello"没有任何关系。当函数结束,str作用消失,原来得内存地址上的内容并未改变。仍然是"Hello"。

栗子3:下列 java 程序输出结果为______。

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
true,true
解释:
==如果是primitive主类型,那么比较值;如果是对象,那么比较引用地址
 equals需要根据具体对象的实现来判断,在Integer里面是判断值是否相等

 i==j ,这个是基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真。

j.equals(i) ,调用 equals 方法后,这个 i 会自动装箱成 Integer 类型,然后再比较值,所以也返回真。

 
 

Java中数据类型转换&基本类型变量和对象型变量的更多相关文章

  1. Java中数据类型转换大全(个人总结)

    一.字符串转换为其他类型 1.将字符串转化为int型 (1)方法一 int i = Integer.parseInt(String str); (2)方法二 int i = Integer.value ...

  2. Java中数据类型转换问题

    boolean类型不可以转换为替他的数据类型. Java中byte(8位).short(16位).char三种类型的优先级是相同的,相同优先级之间是不能进行自动转换的(如果相互转换的话,必须强制类型转 ...

  3. Java基础知识强化22:Java中数据类型转换

    数据类型转换: (1). 自动转换 低级变量可以直接转换为高级变量,这叫自动类型转换.比如: byte b: int b:  long b:  float b:   double  b: 上面的语句可 ...

  4. Java基础知识强化23:Java中数据类型转换(面试题)

    1. 以下代码输出结果是( D ).                     public  class  Test   {                                       ...

  5. java中数据类型转换

    1.自动类型转换:首先两者数据类型要兼容,且目标类型要大于源类型如(int类型转换成double类型) 2.强制转换:两者数据类型要兼容,会使破坏数据的结构

  6. java中数据类型转换注意事项

    1.byte.short.char这三种类型互相做数学运算时都会先提升为int类型后再做运算 char a = 'A'; short b = 1; int num = a + b;//a和b在做运算前 ...

  7. java中强制类型转换

    在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  8. java常用数据类型转换

    在Java开发过程中经常会涉及到数据类型的转换问题,比如数字型转字符型,字符型转日期型,字符串转数组等等,以及其他类型的强制转换等.经常出现,所以有必要总结一下. 1.如何将字串 String 转换成 ...

  9. java中的类型转换

    java中的类型转换分为两种 自动类型转换 要实现数据的自动类型转换必须同时满足下面两个条件 两种数据类型彼此兼容 目标类型的取值范围大于原类型范围 强制类型转换 当两种数据类型彼此不兼容,或者说目标 ...

随机推荐

  1. C#或Net连接Oracle操作提示 Oracle 客户端 version 8.1.7 或更高版本报错

    异常问题 远程连接ORCALE 服务器,而本地未安装任何ORCALE 相关客户端及ODAC .using System.Data.OracleClient;当我们用程序操作Oracle库的时候,OPE ...

  2. ES6相关特性(let & const)

    [ecma-262/8.0]http://www.ecma-international.org/ecma-262/8.0/index.html 1.Let & const let 的三个特性: ...

  3. NWERC 2013 - J (codeforces gym - 100405J)

    题目描述:给你一颗二叉树,保证每个点要么是叶子节点,要么有左右两个儿子.某些叶子节点上放着灯,请你移动最少的灯,使得整棵树平衡 对平衡的定义:对于树上的每个点左右儿子中灯数的差的绝对值≤1,那么这棵树 ...

  4. iis 7 操作 .net

    下面说一下.NET对IIS7操作.IIS7的操作和IIS5/6(using system.DirectoryServices;使用类DirectoryEntry )有很大的不同,在IIS7里增加了 M ...

  5. POJ-2481 Cows---树状数组的运用

    题目链接: https://vjudge.net/problem/POJ-2481 题目大意: if Si <= Sj and Ej <= Ei and Ei - Si > Ej - ...

  6. 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)

    点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...

  7. 2017.11.16 JavaWeb-------第八章 EL、JSTL、Ajax技术

    第八章 EL.JSTL.Ajax技术 ~~ EL (expression language) 是表达式语言 ~~ JSTL(JSP Standard Tag Library) 是开源的JSP标准标签库 ...

  8. matlab的figure窗口命名为中文

    figure('NumberTitle', 'off', 'Name', '我的窗口名字');

  9. fine ui grid控件添加行号

    grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...

  10. 牛客小白月赛2 J 美 【构造】

    链接:https://www.nowcoder.com/acm/contest/86/J来源:牛客网 题目描述 最后,Sεlιнα(Selina) 开始了选美大赛. 一如既往地,Sεlιнα 想最大化 ...