第一章 java简介
程序发布
reference to object
java四过程:
source(XXX.java) ->
编译 ->
bytecodes (XXX.class) ->
JVM 上运行。
一个java程序至少有一个class,并且一个程序有且只有一个main method。
典型Hello world程序
public class FirstJavaApp {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
注意:java里,要使用布尔类型的地方必须是布尔,不能像C++那样,用整数可以代替。
如,while ( 1 ) java下就不行, int a = 1; while (a) 也是不行的。
Class的创建
Class Movie {
String title;
String genre;
int rating;
void playIt() {
System.out.println("Play the movie");
}
}
构建实例
Movie one = new Movie();
one.title = "Gone whit the Stock";
one.genre = "Tragic";
one.rating = -2;
Java中的"全局变量和函数"
java都是类组成,没有真正的全局变量和全局函数,但是有类似的。
在一个类中的方法前,加上 public static,就基本能当做全局函数使用,比如Math.random()函数,基本可以在任何地方访问。
如果给变量加上public ,static , 和 final,也就将它变成了全局变量,谁都能访问。
程序发布
可以把程序和JVM一起打包,放入一个安装程序中,来保证没有JVM的用户,也能正常使用你的程序。
程序类非常多的时候,要打包成.jar文件,一个简单的text文件,格式为manifest,可以定义哪个class里包含了main()函数,程序要从这开始执行。
第二章 变量
变量主要分两类:primitives 和 reference to object。
primitives就是 整数 布尔 还有浮点数。
变量可以看做各种大小不同,且用途不同的杯子,点餐的时候我们说:“我要一个小杯的奶茶。”对于变量这个“杯子”,我们就说:“我要一个int,里面装着90。”。但有个不同就是,这个杯子需要被命名。“我要一个int,里面装着90,并且这个杯子命名为 height”。
下面是基本变量所占大小,和取值范围,不像C,不同编译器可能不同,java这些值都是规定的。稍微注意一下char,和C的不一样。
基本变量的声明方法。
注意:最下面的float f = 32.5f;的声明,写的很清楚,java默认浮点数是double类型,如果没有那个 "f",就变成了 float f = 32.5; 会报
can't convert double to float。说类型不匹配。java严格的类型检查,不允许大杯子向小杯子倒水,double是64,float是32,
但是反过来可以!
注意:double d = 32.5f; 是不会报错的。
大杯的水不能倒在小杯里,小杯的水能倒在大杯里!
注意:int x = 34.5;
不行!
int x = 34.5f;
不行!
boolean boo = 3;
不行!
byte b = 3;
可以
int x = 7; byte b = x;
不行!
byte b = 3; int x = b;
可以
变量命名规则
1、必须以 _ $ 或者字母开头。注意:java能以$开头,数字不行。
2、数字不能开头,但之后都能用了。
3、别与保留字冲突。
reference to object
Dog d = new Dog();这里的d 并不是对象变量,而只是一个object的引用reference。d存了一些数据,用于得到一种去访问object的方法。
将d理解为一个遥控器,这个遥控器是Dog类型的,能够控制远处的一个Dog对象,且一次只能控制一个远处的Dog对象。就像电视机遥控器,给它设置个程序就能控制一台电视,但是怎么设置都不能去遥控空调,因为类型不同。
d像个大点的杯子,里面放着Dog的遥控器,而不是Dog对象本身。
基本变量大小为许多个bits,里面就装的是基本变量的值。而引用,也有大小,也是多少个bits,但里面放着遥控器,即找到、控制对象的方法、途径。
创建引用变量的方法可以分三步:
1、Dog myDog;先分配内存,创建个Dog遥控器,放入myDog这个杯子里。
2、new Dog()创建一个Dog的对象,在Garbage collectable heap,即GC上。
3、给myDog中的遥控器编程,让它指向第二步创建出来的Dog对象。
注意:1、这个遥控器只能遥控Dog对象,但可以改变。就像电视遥控器,可以遥控一个电视,然后调一调又能遥控另一台电视。
但是,如果这个遥控器被声明为
final,那就只能指着同一个object,不能变了。
2、同一个JVM中,reference即遥控器的大小是一样的,但是不同JVM的可能有变化。
GC角度看reference
Book b = new Book();
Book c = new Book();
new Book()的对象,都在GC上,遥控器在外面,指向对象。
再创建个遥控器,
注意,这只再创建了个遥控器,指向原有对象。
Book d = c;
这里只是将之前的遥控器c,开辟空间,把c里面的所有bits复制了一份,放入了杯子b。
如果一个对象,没有任何遥控器指向它,那它就要被交给GC,要被GC消灭了。
数组
对于数组,也分两种情况,即primitivers 和 reference to objects
primitives分三步:
1、int[] nums; 创建int数组遥控器,分配内存,把遥控器放在杯子nums里。
2、nums = new int[7]; 真正的创建int数组object,这个对象里面能容纳7个int。
3、nums[0] = 6;
nums[1] = 19;
nums[2] = 44;
即将int数组对象里面的杯子,装上值,至此,7个元素的int数组创建完成。
注意:数组整体是个对象,即便其内部装的是7个基本类型。
对于reference to object,创建数组的过程也分三步。
1、Dog[] pets; 先创建指向Dog数组对象的遥控器,分配内存,将遥控器放入pets杯子。
2、pets = new Dog[7]; 创建一个对象(object),其内部包含有7个Dog类型遥控器(即引用)的杯子,分配空间,放好遥控器,并让第一步创建的Dog数组的遥控器指向这个对象。
3、pets[0] = new Dog();
pets[1] = new Dog();
正式创建Dog对象,然后让数组对象内的遥控器,指向各个Dog对象。
有点绕,但是看图就知道了。
注意:reference对象数组的object中,装的是遥控器,不是真正的Dog对象。
注意:Dog数组中,pets[i]只能指向声明的Dog类型,可不能指向别的。
但是,前面的基本类型的数组对象,声明的int,但只要不违反小杯子装大杯子水,即溢出原则,那就能装别的类型的变量值,比如 byte b = 4; nums[i] = b;就是合法的。