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); } }
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); } }
注意:若两个浮点数的初值相同,它们在声明是不能写成"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); }
输出示例
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); } }
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); } }
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); } }
输出示例
二、引用数据类型:类、接口类型、数组类型、枚举类型、注解类型;
基本数据类型和引用数据类型的区别主要在存储方式上:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
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本身代码。
附加一个栗子Ψ( ̄∀ ̄)Ψ
我有一个类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); } }
用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中的字符占两个字节。
明天继续运算符和表达式