- 引用操纵对象
Java基于c++,但更加面向对象。java用引用操作对象(这里不考虑基本类型,稍后讲解)。用书上的类比即遥控器(引用)和电视(对象)的关系。想调节电视音量画面频道时,我们用遥控器即可。带着遥控器在房间里走动也可以操控电视。创建引用例子:
Student freshman;
String str;
Car bmw;
//等等
但注意这里引用没有和对象关联,安全的做法是创建引用同时进行初始化。如:
String s = new String("hello");
- 关于对象存储
关于对象储存,我们要粗略了解下程序内存分配。有五个不同地区储存数据:
1.寄存器。最快,但寄存器数量有限。
2.堆栈。仅次于寄存器,java引用存于此。
3.堆。存放所有java对象。在堆里分配储存很灵活,但存储分配和清理会需要更多时间。(c++是在栈中创建对象)
4.常量储存。常量值就在程序代码内部。
5.非RAM存储。数据存活于程序之外。如磁盘里的存储。
- 对象特例:基本类型
就如物质有最小组成单位原子(我不是学物理的可能会有更小的),我们关于对象有特例——基本类型。如boolean,int,char等等。这些如果在堆上储存,太慢了。所以这些并非是引用的,而是直接在堆栈里。
java中每种基本类型占的存储空间不变,不会随硬件变化而变化,这是java具有可移植的原因之一。这里注意每个基本类型有与之对应的包装器类型,使得可在堆中创建一个非基本对象,用来表示对应基本类型。举例:
char c='x';
Character ch=new Character(c);
//Character ch=new Character('x');也行
//高一点的版本有自动包装功能,也可以这样写,后面会学
//Character ch='x';
//还可以反向转换,即抓包
//char c=ch;
对于位数过大的int,考虑BigInteger和BigDecimal,这两个是包装器没有对应基本类型,高精度的代价就是运算速度变慢。
- java中数组
java主要目标是安全性,所有有初始化和超界检查。故数组和c++相比,牺牲少量时间和空间,但取而代之的是安全和效率的提升。
创建数组对象,也是创建一个引用数组,每个引用都会被初始化为null。若java检测到null说明引用没指向其他对象,会报错。
当然也可以创建存放基本数据类型的数组,并且java能保证其被初始化,因为它会将这种数组的内存置零。
- 不用销毁对象
作用域和c++差不多,但也有注意的地方:
{
int x=12;
{
int x=100;//错的
}
}
这个在c++里是可以的,但java不行,编译器会说x已经被定义。这样做原因是设计者认为这样会使得程序混乱。
关于对象的作用域:
{
String s=new String("hello");
}//这里超出作用域
引用s在作用域终点消失,但是s原来指向的对象仍占据内存空间。可惜在这之后我们无法再访问这个对象了,因为指向它的唯一应用没了。java回收掉这个内存靠的是垃圾回收器,这比c++友好。
- 创建新的数据类型:类
用class关键字,如:
class Student{
//省略接口等等
}
创建对象可以这样:
Student freshman=new Student();
java中如果类中某个数据成员是基本类型,那么就算没有初始化,java也会确保其有默认值,具体书上有表格。(注意局部变量是不行的,举例:如果在方法中定义int x;java会报错。)
- 方法、参数、返回值、参数列表
前三个简单,不说了,这里简单说下参数列表,就一句话,注意值传递和引用传递。
- java编码风格
类名首字母大写,如果由几个单词构成则并在一起并且每个单词首字母大写,如:
class AllTheColorsOfTheRainbow{
//
}
方法,成员变量,对象引用名称等等,与类风格一样但第一个字母小写,如:
class AllTheColorsOfTheRainbow{
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue){
//...
}
//...
}
之后是本书练习:
练习一:
class DataOnly{
int num;
char a;
}
public class Test1 {
public static void main(String[] args) {
DataOnly sample =new DataOnly();
System.out.println(sample.num);
System.out.println(sample.a);
}
}
练习二:
public class Test2 {
public static void main(String[] args) {
System.out.println("Hello,World");
}
}
练习三:
class ATypeName{
String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
public class Test3 {
public static void main(String[] args) {
ATypeName sample =new ATypeName();
sample.setStr("Au Revoir");
System.out.println(sample.getStr());
}
}
练习四,练习五:
class DataOnly1{
int i;
double d;
boolean b;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public double getD() {
return d;
}
public void setD(double d) {
this.d = d;
}
public boolean isB() {
return b;
}
public void setB(boolean b) {
this.b = b;
}
}
public class Test4 {
public static void main(String[] args) {
DataOnly1 sample=new DataOnly1();
sample.setB(true);
sample.setD(0.999);
sample.setI(42);
System.out.println(sample.getD());
System.out.println(sample.getI());
System.out.println(sample.isB());
}
}
练习六:
public class Test6 {
static int stroage(String s) {
return s.length()*2;
}
public static void main(String[] args) {
System.out.println(stroage("hello"));
}
}
练习七:
class StaticTest{
static int i=47;
}
class Incrementable{
static void increment() {
StaticTest.i++;
}
}
public class Test7 {
public static void main(String[] args) {
Incrementable.increment();
System.out.println(StaticTest.i);
}
}
练习八:
class Student{
String name;
int age;
static String university;
Student(String str,int num){
name=str;
age=num;
}
}
public class Test8 {
public static void main(String[] args) {
Student a =new Student("XiaoMing",19);
Student b=new Student("XiaoHong",20);
a.university="NanKai";
b.university="Tianda";
System.out.println(a.university);
System.out.println(b.university);
}
}
练习九:
public class Test9 {
public static void main(String[] args) {
Boolean sample1=true;
Character sample2='a';
Byte sample3=127;
Short sample4=42;
Integer sample5=4242;
Long sample6=424242L;
Float sample7=0.42f;
Double sample8=42.4242;
Void sample=null;
System.out.println(sample1+" "+sample2+" "+sample3+" "+sample4+" "+sample5);
System.out.println(sample6+" "+sample7+" "+sample8+" "+sample);
}
}
练习十:
public class Test10 {
public static void main(String[] args) {
int argsLength = args.length;
System.out.println("argsLength:" + argsLength);
for(int i = 0; i < argsLength; i++){
System.out.println("args["+ i + "]" + "=" + args[i]);
}
}
}
练习十一:
class AllTheColorsOfTheRainbow{
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int theHue) {
if(theHue==1) {
System.out.println("red");
}
}
}
public class Test11 {
public static void main(String[] args) {
AllTheColorsOfTheRainbow sample=new AllTheColorsOfTheRainbow();
sample.changeTheHueOfTheColor(1);
}
}
练习十二到十六:
总之加个/** */就行