java核心技术读书笔记(4)
更新日期:
面向对象程序设计(OPP)概述
在OPP中,不必关心对象的具体实现,只要能满足用户的需求即可。
传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题—->算法第一位,数据第二位
而OPP却调换了这个顺序,将数据放在第一位,然后再考虑操作数据的算法。
小规模问题—->分解为过程的开发方式,大规模问题——>面向对象比较合适
类与对象
类是构造对象的模板或蓝图。
对象的三个主要特性:
- 对象的行为(可调用的方法)
- 对象的状态(描述当前特征的信息,但它并不能完全描述一个对象)
- 对象标识(每一个对象都有一个唯一的标识,作为一个类的实例,每个对象的标识永远是不同的)
类之间的关系
- 依赖(“use a”) 一个类的方法操纵另一个类的对象
- 聚合(“has a”)(关联) 一个类对象包含另一个类对象
- 继承(“is a”)
对象与对象变量
Date deadline;//deadline doesn't refer to any object
上述语句定义了一个对象变量deadline,它可以引用Date类型的对象。但是,变量deadline不是一个对象,实际上也没有引用对象。此时不能将任何Date方法应用于这个变量。语句
s=deadline.toString();//将产生编译错误
注意:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。
Date birthday;//java
相当于
Date *birthday;//c++
几个名词:更改器方法(对实例域做出修改的方法) , 访问器方法(仅访问实例域而不进行修改的方法), 构造器(1. 与类同名,2.每个类可以有一个以上的构造器,3.可以有0个,1个或多个参数,4.没有返回值,5.总伴随着new操作一起调用),隐式参数(出现在方法名前,每个方法中都有隐式参数this),显示参数(位于方法名后面括号中的数值) 域访问器(只返回实例域值的访问器方法)
注意:不要编写返回引用可变对象的访问器方法。
class Employee{
private Date hireDay;
...
public Date getHireDay()
{
return hireDay;
}
...
}
这样会破坏封装性!
Employee harry=...;
Date d=harry.getHireDay();
double tenYearsInMilliSeconds=10*365.25*24*3600*1000;
d.setTime(d.getTime-(long)tenYearsInMilliSeconds);
出错的原因:d和harry.hireDay引用同一个对象。对d调用更改器方法就可以自动改变这个雇员对象的私有状态!
解决方法:对它进行克隆(clone) 修改后代码:
class Employee{
private Date hireDay;
...
public Date getHireDay()
{
return hireDay.clone();
}
...
}
final关键字
final修饰符,可以修饰类,修饰方法,修饰变量
final修饰的类不能被继承
final修饰的方法不可以被覆盖
final修饰的变量是一个常量,只能赋值一次。
当使用的数据不变时,需要定义阅读性强的名称来表示该数据,并将该数据final化,被final修饰的变量名称规范是:所有字母都大写,如果由多个单词组成,需要通过_进行分隔。
static 修饰符
用static修饰的方法称为静态方法,静态方法不需要通过类的实例化就可以直接使用。
public class A {
public static void print()
{
System.out.println("静态的打印方法!");
}
public void print1()
{
System.out.println("实例方法的打印方法!");
}
}
特别需要注意的是静态方法不能用abstract修饰,因为静态方法必须在本类中提供实现,而abstract方法是在子类中实现,二者自相矛盾。
用static修饰的变量称为静态变量
在类加载的过程中完成静态变量的内存分配,可以直接通过类名加变量名直接访问该变量。
静态变量有点类似于C++中的全局变量。
public class A {
public static int num=5;
public void setNum(int num)
{this.num=num;}
public static void print()
{
System.out.println("num="+num);
}
}
static变量的作用是用来在类中不同对象的数据共享
static代码块
静态代码块在类加载的时候只执行一次,如果把构造方法看成对象的初始化,则可以把静态代码块看成类的初始化,在代码块中可以初始化类中的静态变量。
public class A {
public static int num;
static
{num=7;}
@SuppressWarnings("static-access")
public void setNum(int num)
{this.num=num;}
public static void print()
{
System.out.println("num="+num);
}
}
在静态代码块中完成静态变量num的初始化,此时num值为7
静态代码块还可以完成一些其他的初始化。在JDBC(一种连接数据库的技术,用Java实现)的应用中可以经常看到!
注意:最后需要补充的一点的是实例方法和实例变量都不能在静态方法或者静态代码块中出现,this和super关键字也不能在静态方法和静态代码块中出现,原因是static关键字是用来修饰属于类的变量和方法,而所有和具体对象相关的实例方法,实例变量及与实例相关的关键字(this,super)都不能放入,不然会造成自相矛盾,编译也会报错!
super和this的用法:
this代表的是本类对象引用。 this.num
super代表的是父类的那片空间。 super.num
java中方法参数的使用情况
- 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象