一、封装
封装是面向对象里面一个基本概念,先通过图片中蛋清与蛋黄来感性了解一下
封装,就是把数据和对数据的操作放在一起,并且是操作来把数据掩盖起来。
Tips:
1、所有的成员变量必须是private的,这样就能避免别人进行改动从而造成混乱
2、所有public的函数只是用来提供服务的,而不是用来直接访问数据的,除非这个类单纯到只是访问数据。
二、几种访问属性
private:
private可以用在成员变量前面也可以用在成员函数前面,它表示这个成员是这个类所私有的,
即只有在类内部操作时才能访问它。
但是比较难理解的一点是:这个限制是对类的而不是对对象的。
我们以Fraction的代码中的加法操作的函数为例:
一个类所有的不同的对象之间可以互相访问别人的私有成员
Fraction plus(Fraction f){
int c =this.b*f.b;
Fraction s = new Fraction();
s.b=c;
s.a=f.a*this.b+this.a*f.b;//例如这里可以直接访问f.a和f.b
return s;
}
public:
public即任何人都可以访问。这个真的没什么好说的。
friendly:
如果前面没有限定词,既没有private,也没有public,那么这种类型叫做friendly,什么意思呢?
friendly表示这个成员函数或者成员变量甚至是类,可以在一个包内相互访问
Tips:1、一个.java的类中只能有一个public的类,而且这个类的名字必须与文件名相同!
也就是当一个.java文件中有多个类的时候,只能有一个是public的
2、一个.java文件叫做一个编译单元,编译的时候一次对这一个.java文件进行编译
三、包治百病!
当程序很大,类很多的时候,就需要一个机制管理一个工程中众多的类了。
包就是Java的类库管理机制,他借助文件系统的目录来管理类库。
一个包就是一个目录,一个包内的类必须放在一个目录下,并且个目录的包必须是包的名字。
如果我们在一个包的类中要引用另一个包的一个类,那么我们就需要import
例如我们要调用另一个名为Display的包的名为display的类,那么我们可以再当前文件中包的那一行下面加一句
import Display.display;
我们也可以
import Display.*;//这样是把这个包所有的类都引进来,但是有时候会引起混乱,所以不推荐使用
包的名字里可以有 . ,这个点表达的就是文件夹的层次
四、类变量
static:
如果某个成员有static做修饰,他就不再属于某一个对象了,而是属于整个类的了。
比如我们文件里加一个static的成员变量flag初始化为1。
private static int flag = 1;
你可以通过某个对象来修改flag为0,但是修改之后,你再通过其他对象输出flag,flag不再是1了,而是0。
而且我们可以直接 类 . flag = 3 来将flag修改为3
这说明static修饰后,变量属于整个类,而不是属于各自的对象。
让我们再捋一捋
未加static的成员变量是属于对象的!
加了static的成员变量是属于整个类的!
所以我们把加了static的变量叫做类变量
所以当我们通过对象访问类变量的时候,对象会进行回溯,找到自己的类中的那个类变量,然后进行操作。
无独有偶,加了static的函数叫做类函数
在static的函数里你可以直接调用其他static的函数,
但是在通过某个对象调用static函数的时候,你并不能获得那个对象的什么信息。因为类函数也是属于类的。
那么我们接下来可以说一说为什么系统自动生成的main函数为什么是
public static void main(String[] args) {
1、为什么是public?
因为要通过虚拟机调用,当然不能设定成私有的或friendly
2、为什么是static?
因为如果没有static,那么main函数必须通过对象调用才能运行此函数,所以main函数可以在无需建立任何对象的情况下作为程序运行的入口。
3、为什么是(String[] args)?
其实这个名字是为了与Sun Java规范范例中的main()的参数名保持一致,取名为args
String数组是为了截获命令行输入参数,具体不是很清楚
最后当然要愉快的贴代码啦~
做的模拟时钟(小时:分钟)
主要思想:小时和分钟大致是一种表现形式,所以我们可以定义一个类,然后根据这个类创造出两个对象hour和minute
关键在于我们想要使各对象之间相互独立,并且是通过更高层的类来管理这两个类,这种思想学到了,还很简单,希望以后能做更多大工程,不说废话了,贴代码~
第一个类,是用来创造hour和minute的
package clock;
public class Display {
int value = 0;
int limit = 0;
Display(int limit)//各自进制不同所以构造函数还是要传参
{
this.limit=limit;
}
void increase()
{
value++;
if(value==limit)
{
value=0;
}
}
int getvalue()
{
return value;
}
public static void main(String[] args) {
}
}
第二个类,是用来合并并且实现进位的
package clock;
public class Clock {
private Display hour = new Display(24);
private Display minute = new Display(60);
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) {
Clock clock = new Clock();
clock.start();//时钟启动!
}
}
nice!