2021-07-15

Java的数据类型

 

一、Java基本数据类型共有八种,基本类型可以分为三类。

 

字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。

数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。

JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。

 

基本类型byte 二进制位数:Byte.SIZE最小值:Byte.MIN_VALUE最大值:Byte.MAX_VALUE

基本类型short二进制位数:Short.SIZE最小值:Short.MIN_VALUE最大值:Short.MAX_VALUE

基本类型char二进制位数:Character.SIZE最小值:Character.MIN_VALUE最大值:Character.MAX_VALUE

基本类型double 二进制位数:Double.SIZE最小值:Double.MIN_VALUE最大值:Double.MAX_VALUE

 

 

1、整型类型变量示例

 

public class zhengxing
{
  public static void main(String args[])
  {
    byte a1 = 051;          //八进制数
    byte a2 = 0x21;           //十六进制数
    byte a3 = 30;            //十进制数
    int b1, b2, i1 =7;
    short c1 = 0x1D2;
    long d = 0x10EF, d1 = 1234567;
    b1=b2=15;
    System.out.print("sum=" +(1+5));
    System.out.print("\ta1=" +a1);
    System.out.print("\ta3=" +a3);
    System.out.print("\tb1=" +b1);
    System.out.print("\tc1=" +c1);
    System.out.print("\td1=" +d1);
 }
}

 

Day5---学习Java第二弹_十六进制

 

 

 2、浮点类型变量示例

 

public class fudianxing {

    public static void main(String[] args) {
        float x =85.0f,y,z;  //定义三个单精度变量
        y = 47.8f;
        z =x/y;
        System.out.println(x+"/"+y+"="+z);
    }

}

 

Day5---学习Java第二弹_八进制_02

 

 

注意:若两个浮点数的初值相同,它们在声明是不能写成"float a1 = a2= 3.4f;"而只能写成"float a1 = 3.4f,a2 = 3.4f;"

常量值后面的f不能省略。

 

3、字符型变量示例

 

public class zifuxing {

    public static void main(String[] args) {
        char data1 ='b';
        char data2 =98;
        int i =98;
        char j =(char)i;
        System.out.println("value of data1 is" +data1);
        System.out.println("value of data2 is" +data2);
        System.out.println("value of j is" +j);
    }

 输出示例

Day5---学习Java第二弹_java_03

 

public static void main(String[] args) {
        char c1,c2,c3,c4;
        c1='\\';
        c2='H';
        c3='T';
        c4='\115';
        System.out.print(c1);
        System.out.print(c2);
        System.out.print(c3);
        System.out.print(c4);
    }

}

Day5---学习Java第二弹_浮点_04

 

 

public class zifuxing {

    public static void main(String[] args) {
        int i=65;
        char c='a',cc='王';
        System.out.println(i);
        System.out.println((char)i);
        System.out.println(c);
        System.out.println((int)c);
        System.out.println(cc);
        System.out.println((int)cc);
        System.out.println((char)24352);
    }

}

Day5---学习Java第二弹_浮点_05

 

 

 4、布尔类型变量示例

 

public class boolea {

    public static void main(String[] args) {
        boolean x , y, z;
        int a=89, b=20;
        x=(a>b);
        y=(a!=b);
        z=(a+b==43);
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("z="+z);
    }

}

输出示例

Day5---学习Java第二弹_十六进制_06

 

 

 

二、引用数据类型:类、接口类型、数组类型、枚举类型、注解类型;


基本数据类型和引用数据类型的区别主要在存储方式上: 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

int a = 5;//这里的a是对象(严格来说不算是对象,只是个符号标识),5是数值
Integer a = 5;//这里的a是一个引用,5才是一个对象,更形象常见的是:
Object o = new Object();//o是引用(栈中),new Object()是对象(堆中)
//第二行代码中,5被自动包装成Integer对象

 

Java的引用与指针比较相似,但和指针不同的是,不能通过改变他的值从而去改变他所只指向的值,Java引用不支持对内存直接操作,而指针可以。

 

 

关于存放内存地址问题,我又搜了一下Java内存结构。

 

Java的内存结构,可以分为以下几个部分:堆、栈、非堆以及其他。

 

1.堆:存放Java对象,所有的对象(包括数组,但Class对象除外)数据实际存放地方。堆是程序级别,每一个Java程序共享一个堆(所以存在多线程访问堆内存同步问题)。

 

2.栈:存的是引用(如果是基本类型,则存的是值),引用(直接或间接)指向堆中的对象。栈是线程级别,每一个线程有各自的栈。栈又分为两种,一是Java方法栈,一是本地方法栈(有的JVM这两者是合在一起的,不过这里还是讨论逻辑上)。另外,每个线程都有各自的程序计数器,也是栈格式的。

 

3.非堆:方法区、常量池、静态变量、即时编译后的代码等(貌似jdk1.7常量池又放在堆中了,逻辑上还是单独拿出来好了),堆与非堆的区别是,堆是供给程序使用,而非堆是供给JVM使用的。(严格来说,栈也是非堆?),因为主要是方法区,这部分又常常被称为方法区,又因为这部分数据不会(应该说很少会)被GC(GC,垃圾对象回收,详见下一节),所以也称为永久代。

 

4.其他:存放JVM本身代码。

 

Day5---学习Java第二弹_十六进制_07

 

 

附加一个栗子Ψ( ̄∀ ̄)Ψ

 

 

我有一个类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可以找到堆中对象的具体信息。

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、在根据课本练习不同类型变量的代码时,有的代码中输出用print,有的用println。下面是Java中print、printf、println的区别

 

 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出

 

print就是一般的标准输出,但是不换行

 

println和print基本没什么差别,就是最后会换行

 

 print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。

 

println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。

 

 printf是格式化输出的形式。

 

举个栗子U•ェ•*U 

 

public class TestPrint {
public static void main(String[] args) {
int i = 4;

double j = 5;

System.out.print(“用print输出i:”+ i);

System.out.println( “用println输出i:”+ i);

System.out.printf(“i的值为%d,j的值为%f”, i,j);

}

}

 

Day5---学习Java第二弹_基本类型_08

 用print输出i后,没有换行,用println输出的结果直接在print输出语句后面,而输出println后换行了,所以用printf输出时,在第二行

至于printf,和C语言里面的基本差不多。

 

附带查到的 JAVA API 的定义:

‘d’ 整数 结果被格式化为十进制整数

‘o’ 整数 结果被格式化为八进制整数

‘x’, ‘X’ 整数 结果被格式化为十六进制整数

‘e’, ‘E’ 浮点 结果被格式化为用计算机科学记数法表示的十进制数
‘f’ 浮点 结果被格式化为十进制数

‘g’, ‘G’ 浮点 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。

‘a’, ‘A’ 浮点 结果被格式化为带有效位数和指数的十六进制浮点数

 

 

二、浮点型变量示例中的 x=85.0f 的f含义

 

浮点数常量:由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。

 

如:float f;

 

    f=1.3f;//必须声明f。

 

附带其他常量的要求:

 

十六进制整型常量:以十六进制表示时,需以0x或0X开头,如0xff,0X9A。

 

八进制整型常量:八进制必须以0开头,如0123,034。

 

长整型:长整型必须以L作结尾,如9L,342L。

字符常量:字符型常量需用两个单引号括起来(注意字符串常量是用两个双引号括起来)。Java中的字符占两个字节。

 

明天继续运算符和表达式