在前两篇中,我们写了一个简单的java入门程序,同时带出了一些类和方法的定义规则,也对什么是类,什么是对象以及什么是属性和方法做了一定的解释。 java基础介绍及第一个java程序 java基础之类、对象、实例、属性、方法等概念理解
我们应该知道了一个java类可以不定义任何的属性和方法,但是正常来说都是需要定义属性和方法的。 在属性定义的时候我们定义了这样一个类:
public class People {
public String eye;
protected String ears;
String mouth;
private String nose;
}
在这个类定义里引入了一个新的概念,也是遗留问题,即数据类型。
java数据类型宏观分类
上边的类定义里,String即一种数据类型,String类型对应一个java类,这个类的名称就叫做String。 在java中,数据类型主要分为两大类,一类是基础类型,另一类是引用类型,上边的String就是引用类型。 基础类型只有8种,是比较特殊的,因为他们实际没有直接对应的类。 但是这八种数据类型都有对应的封装类,算是对java一切皆对象的一个补充。 而引用类型,就是除了8种基础类型之外的所有的类,既可以是jdk中提供的,也可以是程序员写代码过程中自定义的。
基础类型
八种基础类型分别是byte、short、char、int、long、float、double、boolean。 八种数据类型都有对应的封装类,分别是Byte、Short、Character、Integer、Long、Float、Double、Boolean,可以看出来,除了char和int的封装类名称特殊外,其他的都是相应基础类型的首字母大写。 这些封装类和其他java类一样遵循java类定义的规则,里边的属性定义的时候,类型就是对应的基础类型,所以称作基础类型的封装类。 封装类也称作包装类,意思就是对基础类型进行了一层包装。 因此,从名称上也大概可以知道,包装类的性能应该是没有基础类型好的。 基础类型有八种,但是还可以进一步分类,前5个除了char都是整数相关的,因此也称作整型,char是字符类型,float和double是小数相关的,也称为浮点型,最后一个boolean叫布尔型,布尔型只有两个值,一个是true,还有一个是false。
整型
上边说整型有四个,分别是byte、short、int、long,他们的都是用来存整数,区别就是长度不同,或者通俗点理解为容量。 byte使用一个字节存储,能存储的范围是-128至127; short使用两个字节存储,能存储的范围是-32768至32767; int使用四个字节存储,能存储的范围是正负21亿多,是个比较大的数字,也是最常用的一个。 long使用八个字节存储,存储范围比int更大,所以一般只有可能超过int存储范围的时候,才使用long。 这些类型的长度实际可以直接从相关的封装类中取到,例如:
public static void main(String[] args) {
System.out.println(Byte.MIN_VALUE+"至"+Byte.MAX_VALUE);
System.out.println(Short.MIN_VALUE+"至"+Short.MAX_VALUE);
System.out.println(Integer.MIN_VALUE+"至"+Integer.MAX_VALUE);
System.out.println(Long.MIN_VALUE+"至"+Long.MAX_VALUE);
}
上述代码输出结果如下:
-128至127
-32768至32767
-2147483648至2147483647
-9223372036854775808至9223372036854775807
字符型
char 类型是一个单一的 16 位 Unicode 字符,16位,实际也就是2个字节。 char类型理论上可以存储任何unicode字符,包括汉字。
浮点类型
两个浮点类型都不是精确的小数,float只能保证6-7位有效的小数位,double只能保证15-16位有效小数位。 因此如果是如银行这种必须要绝对精确的数据,就需要用到另一个精确的浮点类型,这个类型是引用类型,即BigDecimal。
布尔型
布尔型非常简单,就两个值,一个true,代表真,一个false,代表假。或者也可以理解为,true代表是,false代表否。
引用类型
最开始其实也说了,除了8种基本数据类型之外的所有java类型都是引用类型,包括jdk提供的和程序员自己定义的。 只不过,jdk中提供的有一些引用类型非常的常用,也就是所谓的java核心api,例如集合类、时间操作类、IO流相关类、线程类、String类等。
数据类型使用
上边简单介绍了8种基本数据类型以及引用类型,我们也知道在java类定义的时候一定要显示指定数据类型。 这里必须指定数据类型其实就是所谓的强类型语言,还有一种弱类型的语言,就不需要显示指定数据类型。 数据类型实际上也可以理解为是一个抽象的统称,只有在实际用的时候才会是具体的对象。 当然了,这里有一个问题可能还需要考证,基础类型的实际值是否是对象呢?我个人觉得从java一切皆对象的思想来说,应该是可以暂且这样理解的。 那么数据类型是否就是用来定义类的属性的呢?当然不是的。 在定义java类的时候指定数据类型,只是数据类型使用场景之一,更准确的说,数据类型是被用来定义变量和常量。
变量
变量分为实例变量、成员变量、静态变量和局部变量以及形参,这里的形参是我自己的理解。 其中成员变量、实例变量和静态变量都是定义在类中,并且在方法和代码块之外的,局部变量则是定义在方法或者代码块里边,而形参就是定义方法的时候那个小括号里的。 其中,成员变量包括实例变量和静态变量,实例变量是属于类的实例对象的,而静态变量就是属于类本身,不同在于静态变量需要使用static关键字进行修饰。 例如如下一个类定义:
public class DataType {
String dataName;
static String dataDescription;
{
int num;
}
public void dataTest(double money){
double sum;
}
}
这里的"String dataName"就是一个实例变量,在类的对象实例化的时候才会创建和赋值,每一个对象都是不同的一份。而"static String dataDescription"是静态变量,对于同一个类,不管有多少个实例对象,都只有一份。 "int num"和"double sum"即局部变量,一个在代码块中定义,一个在方法体中定义。 "double money"就是形参,在方法定义的小括号中定义。
常量
常量可以理解为特殊的变量,需要使用final关键词修饰,可以是属于类的,也可以是属于实例的,常量的变量名一般使用全大写(具体明明规则后续再说),例如在上边的类中增加两个常量的定义:
public class DataType {
String dataName;
static String dataDescription;
final static int DATA_ID=1;
final int DATA_NO=1;
{
int num;
}
public void dataTest(double money){
double sum;
}
}
常量的里的“常”可以理解为永恒、不变的意思,所以说常量可以理解为特殊的变量,即不变的变量,因此常量在定义的时候就必须给他显示的赋值,否则就会编译不过,提示语法错误。 但是需要注意的是,这里所谓的不变,其实是要看数据类型的。 如果是基础类型,那么就是值不能改变,例如上边定义的两个int类型的,就不能再修改他们的值,否则编译报错。 如果是引用类型,那么引用类型里边的普通成员变量的值实际是可以改变的,这里的不变实际是指的引用类型的引用,引用指的就是这些数据在计算机内存中的一个地址。 例如这里再自定义一个类,如下:
class Data{
int a;
String b;
public Data(int a, String b) {
this.a = a;
this.b = b;
}
@Override
public String toString() {
return "Data{" + "a=" + a + ", b='" + b + '\'' + '}';
}
}
然后再在上边的类中定义一个这个类型的常量,之后代码如下:
public class DataType {
String dataName;
static String dataDescription;
final static int DATA_ID=1;
final int DATA_NO=1;
final static Data DATA=new Data(1,"1");
{
int num;
}
public void dataTest(double money){
double sum;
}
public static void main(String[] args) {
DATA.a=2;
System.out.println(DATA);
};
}
上边代码在定义DATA常量的时候创建了一个Data类型的对象,给Data里边的a赋值为1,之后再main方法里又给这个值赋值为2,这是完全没有问题的。 但是如果我们要在main方法里写下边这样的代码,就会编译出错:
DATA_ID=2;
DATA=new Data(2,"3");
这里的第一行是直接改变基础类型的常量的值,第二行则是改变引用类型的常量的引用,这都是不被允许的。
变量的声明、初始化、赋值和使用
上边一直在说变量的定义,其实更准确的描述,应该是变量的声明。 在变量使用的时候有这样几个概念需要了解,即声明、初始化、赋值和使用。 什么是声明呢?“修饰符 类型 变量名称"这种就是声明,例如上边的"String dataName”、“static String dataDescription”、“final static int DATA_ID”、“int num”、“double money"这些全部都是变量的声明,而"final static int DATA_ID=1”、“final static Data DATA=new Data(1,“1”)”、“DATA.a=2"这些都是对变量赋值,即java中使用”="对变量赋值,除了常量外,理论上可以对一个变量不限次数赋值。 那么初始化,实际上就是第一次对变量的赋值。 java中的变量必须初始化之后才能被使用,但是需要注意的是,初始化分为显式和隐式。 显式指的就是程序员写代码的时候要直接写出来的,隐式指的是程序员写代码不用直接写出来,在编译或者运行的过程中给值。 成员变量里,除了常量必须显式初始化外,静态变量和示例变量都可以不显式初始化,都有默认值。 实例变量在使用之前就必须显式初始化,否则编译报错。 而形参,在定义的方法里可以直接使用,但在调用这个方法的时候传入的参数就需要遵循实例变量和成员变量的初始化规则。 至于变量的使用,把一个变量赋值给另一个变量是使用,把一个变量作为参数传给某个方法是使用,拿某个变量进行运算也是使用,修改这个变量的值也是使用。
对象实例化
上边在常量举例的时候,有创建一个"Data"类然后创建了一个这个类型的常量,其中"new Data()“这种写法就是java中实例化对象的用法,即"new 类的构造方法”。 构造方法分为无参和有参,无参就是指小括号里没有内容的,有参就是小括号里有内容的,一般有参构造方法就是用来给类的属性初始化赋值,上边的写法就是用的有参构造方法。 需要注意的是,有参构造方法需要显示的定义,而无参构造方法是可以默认不写的。 但是前提是,只有没有有参构造方法的时候才会有默认的无参构造方法,一旦写了有参构造方法,也就没有了默认的无参构造方法,如果还需要用无参构造方法,就也需要显示的定义。 在上边的"Data"类中实际还有一个toString方法,这个不是必须的。
|