Java学习笔记
前言
编程规范:
l 大括号成对写
l 左括号有空格
l 遇左括号Tab
l 程序块之间有空行
l 运算符两侧加空格
l 并排语句之间加空格
注释:
单行注释 //
多行 /* */
文档 /** **
关键字:
关键字全部小写,goto和const为保留字
标识符:
不能以数字开头,_ 和 $都可以
大小写规范:
1. 包(文件夹) 全部小写
2. 类和接口 一个或多个单词首字母大写(驼峰)
3. 方法和变量 一个单词小写,多个第二个单词大写,setName
4. 常量 一个单词大写,多个加下划线_ MAX MAX_NUMBER
1.1理解对象和类
对象定义:代表现实世界中可以明确标识的一个实体。比方说一个学生,一个女人。
对象有两部分:
A. 状态(state),也称为特征(property)或者属性(attribute),是指当前的数据域。比方说吧,一个女的三维。
B. 行为(behavior)或者叫动作(action)由方法定义。调用对象的方法就是要求对象完成一个动作。如果我们把女人当作对象的话,那么调用测三维的方法就可以得知该女生三维的具体值。
说清楚了对象,我们再来总结下类,类的书面定义:使用一个通用类来定义同一个类型的对象。类是一个模板、蓝本,用来定义对象的数据域是什么以及该方法是做什么的。一个对象(object)是类的一个实例(instance)。其实说了半天,如果女人是个对象的话,各种职业的女性就是女人的具体实例(instance),我们用女人这个类来定义女人的通用特征,比方说颜值,三维,身高,体重等等,他还有很多行为(behavior),炒菜呀,做饭呀,化妆呀等等。
C.构造方法(constructor),一种特殊类型的方法,有两个作用:
1 创建一个新对象;
2 构造方法可以完成任何动作,但初衷是为了完成初始化动作。
现在我们清楚了类的组成了,下面是一个例子,
public class Object {
double bust = 30; //所谓的状态,数据域
Object () {
}
Object(double newBust) { //有参构造和无参构造
bust = newBust;
}
doublegetbust() { //方法
return bust;
}
}
另外类的模板和对象的图解可以使用统一建模语言(Uified Modeling language,UML)表示,看着挺方便的。在这就不画了。以上是自己学习时的理解,如有不妥地方,欢迎指正。
1.2对象的构造和引用
先讲一下构造方法,构造方法作为一种特殊的方法,最主要的作用就是使用new来构造对象,它们有以下三个特殊特性:
A. 构造方法必须具备和所在类相同的名字;
B. 构造方法没有具体的返回类型,甚至连void都没有;
C. 构造方法是在创建一个对象时,使用new操作符时调用的,构造方法的作用是初始化对象。另外构造方法也可以重载,这样可以使不同初始数据值来构造对象。
一般情况下,一个类会提供一个没有参数的构造方法,称为无参构造(no-arg(argument)constructor)。没有明确定义的话,类会自动生成。
然后在写一下引用变量,对象是通过引用变量(referencevariable)来访问的,该变量包含对对象的引用。下面讲如何引用:
1) 声明:类名对象引用变量,我就直接使用书上的例子了,Circlemycircle;
2) 引用:对象引用变量 = new 构造方法,myCircle = new Circle();其实就是new创建一个对象,并把该对象的引用赋给变量。
3) 声明引用:类名 对象引用变量 = new 构造方法,这样便完成从创建对象,声明引用变量和把该对象的引用赋值给引用变量,CirclemyCircle = new Circle()。
创建一个对象之后,可以用圆点运算符(.)来访问和调用。三个词,实例变量(instancevariable),实例方法(instancemethod)和调用对象(callingobject)。这里有几个要注意的点;
a) 静态方法可以通过类名.实例方法来调用;
b) 创建对象之后可以不引用,这就是后面的匿名对象(anonymous object),可以用new 构造方法.方法,做一些返回值的使用。
c) 如果没有引用任何对象,
l 引用类型默认值null;
l 数值类型默认值0;
l Boolean类型默认值false;
l Char类型默认值‘\u0000’;
1.3 基本类型变量和引用变量的区别
每个变量都代表一个存储值的内存位置。声明一个变量,就是再告诉编译器这个变量可以存放什么类型的值。区别如下:
i. 基本类型变量,存储的是基本类型值;将基本变量赋值给另一个变量时,是将变量的实际值赋给另一个变量;
ii. 引用类型变量,存储的是一个引用,是对象的存储地址;对于一个引用变量来说,赋值的时候,是把变量的引用赋值给另一个变量。
还有需要知道的两点,第一,当不需要某个对象时,可以显示赋值null。第二,如果对象没有被任何引用变量所引用,Java虚拟机将自动回收它所占的空间,但不一定是立即回收,所以java程序挺占内存的。
另外Java中只有一种参数传递方式:值传递(pass byvalue)。
A. 基本类型变量,传递的是实参的值。
B. 引用类型变量,传递的是对象的引用。传递对象的引用在C里面叫传递地址值,个人感觉这样说更好理解。传递引用类型变量时,注意到它是处理相同引用(共同地址的内容),还是只处理传过来参数的指向。
再举一个例子,会了这个我才觉得是真的理解了基本类型和引用类型在值传递上的区别,
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date = new Date(1234567);
m1(date);
System.out.println(date.getTime());
}
public static void m1(Date date) {
date = new Date(7654321);
System.out.println(date.getTime());
}
}
1.4静态变量、常量和方法
一、 静态变量:
如果想让一个类的所有实例共享数据,就要使用静态变量(static variable),也称之为类变量(classvariable)。静态变量把变量值存储在一个公共的内存地址。另外无需创建实例,就可以调用静态方法(staticmethod)和静态变量(static variable),这样的好处是提高了程序的可读性。
提到静态变量,不得不再提下静态方法,不能从静态方法中调用实例方法或者引用一个实例变量,但是可以从实例方法中调用静态方法和变量。我们都知道在测试类中,也就是有main的类中,用到的大部分是静态方法。这些看似不经意的小问题,现在想想也挺有意思的。因为main也是静态方法,所以它调用的也必须都是静态方法,调用实例方法都会发生错误。但是这又是为什么呢?原因很简单,静态变量和方法创建早于实例方法和变量。下面就是一个错误的例子:
public class Foo {
int i =5;
static int k =2;
public static void main(String[] args) {
int j = i;
m1();
}
public m1(){
i = i + k;
}
public static int m2(int i, int j) {
return (int)(Math.pow(i, j))
}
}
改正的话,就是在主方法main中创建一个Foo对象然后在引用就ok,
Foofoo = new Foo();
Intj = foo.i;
foo.m1();
二、 常量
常量也应该是所有实例所共享的,常量应该被声明为 final static。
三、变量的作用域
实例变量和静态变量成为类变量(class’svariable)或数据域(data field)。类变量的作用域是整个作用域。类的变量和方法可以以任意顺序出现。除了一个数据域是基于另一个数据域初始化的。
如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,同名的类变量将被隐藏。 想要在方法中使用类变量,就要使用this来引用类的隐藏数据域(hiddendata field)。当然如果是静态变量还可以使用类名.静态变量的方法。 另外,this还可以用来调用同一个类的其他构造方法。如下例所示:
public classCircle {
private double radiu;
public Circle (double radiu) {
this.radiu = radiu;
}
Public Circle() {
this(1);
}
}
1.6 对象数组
对象的数组实际上是引用变量的数组。如下例所示:
声明创建创建含有5个Woman对象的数组,
Woman[]woman = new Woman[5];
初始化数组,可以用for循环:
for(int i =0; i < 5; i++) {
woman[i]= new Woman();
}