2.1 对象交互
2.1.1 时钟的设计:
用一个类来表示时钟和分钟。
对象Display:
(属性)成员变量value limit
(操作)成员函数increase getValue
package clock;
public class Display {
int limit=0;
int value=0;
public Display(int limit)//构造函数初始化limit
{
this.limit=limit;
}
void increase()
{
value++;
if(value==limit)
value=0;
}
int getValue()
{
return value;
}
public static void main(String[] args) {
// 这个main是方便调试
Display d=new Display(24);
for(;;)
{
d.increase();
System.out.println(d.getValue);
}
}
}
2.1.2 对象交互
clock对象管理hour对象和minute对象,clock对象在内存中打开hour和minute对象实现交互:当minute为零的适合hour+1
对象Clock:
成员变量hour minute
成员函数start
package clock;
public class Clock {
private Display hour=new Display(24);
private Display minute=new Display(60);
public void start() {
while(true)
{
minute.increase();
if(minute.getValue()==0)
{
hour.increase();
}
System.out.printf("%02d:%02d\n", hour.getValue(),minute.getValue());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Clock clock=new Clock();
clock.start();
}
}
2.2 访问属性
封装,就是把数据和对这些数据的操作放在一起,并且用这些操作把数据掩盖起来,是面向对象的基本概念之一,也是最核心的概念。
2.2.1 封闭的访问属性
封装的实现:所有的成员变量都应该是私有的private 成员变量(和成员函数)
private意味着只有在这个类的内部才能访问它:类内部指类的成员函数和类的初始化,这个是针对类的而不是针对对象的。
所有public的函数,只是用来实现这个类的对象或类自己要提供的服务的,而不是用来直接访问数据的。除非对数据的访问就是这个类及对象的服务。简单地说,给每个成员变量提供一对用于读写的get/set函数也是不合适的设计。
2.2.2 开放的访问属性
public任何人都可以访问:任何类的函数或定义初始化中可以使用,使用指可以访问,调用或定义变量
比如构造函数就需要是public的。
public class must be defined in its own file.
编译单元:
一个源代码文件(.java)是一个编译单元;一次对一个编译单元做编译。
无访问关键字(没有说明public还是private)——friendly:
同一层次的包的其他类可以访问。
2.3 包 Package
包就是Java的类库管理机制,它借助文件系统的目录来管理类库,一个包就是一个目录,一个包内的所有的类必须放在一个目录下,那个目录的名字必须是包的名字。
使用别的包里的类就需要import:
import.<包的名字>.<类的名字>;
import.<包的名字>.*;//全部
包内包:包的名字中的.意为文件夹层次
2.4 类变量
2.4.1 类变量
类是描述,对象是实体。在类里所描述的成员变量,是位于这个类的每一个对象中的。
类变量用static关键字做修饰,它就不再属于每一个对象,它属于这个类。
通过每个对象都可以访问到这些类变量和类函数,但是也可以通过类的名字来访问它们。
private static int step = 1;
用类名.类变量名
访问类变量,也可以用对象名.类变量名
。
2.4.1 类函数
类函数【这个函数不属于任何对象,它属于这个类】
类函数由于不属于任何对象,因此也没有办法建立与调用它们的对象的关系,就不能访问任何非static的成员变量和成员函数了。
在public static viod main (类函数)中,访问不带static成员变量和成员函数,要通过对象去访问,不能直接访问。
static变量只在类装载的适合初始化一次,而不是每次new对象的时候都初始化一次,和对象的创建是没有关系的。