慕课网翁恺老师《面向对象程序设计——Java语言》第二周对象交互——课程笔记

二、对象交互

2.1 对象交互

2.1.1 前言

  • 面向对象程序设计的第一步,就是在问题领域中识别出有效的对象,然后从识别出的对象中抽象出类来
  • 面对纷繁复杂的显示问题,往往存在多种对象划分的方式,而不同的划分会带来类的设计的不同以至于程序结构的各种不同。
  • 本周课程举了一个数字钟的例子,希望通过这个例子表明对象划分的重要性,给我们一个感性的认识;
  • 一个对象可以由其他类的对象来组成。当一个对象里有多个对象的时候,对象和对象之间的联系紧密程度叫作耦合,对象和对象的耦合程度越紧,表现在源代码上就是它们的代码是相互牵制的。
  • 我们理想的模型:是对象和对象之间的耦合尽可能的松,平行的对象要尽量减少直接联系,让更高层次的对象来提供通信服务。这些就是在我们这个非常简单的数字钟的例子中所体现的。

2.1.2 设计数字种

慕课网翁恺老师《面向对象程序设计——Java语言》第二周对象交互——课程笔记_第1张图片

我们在设计数字钟的时候,定义了子类Display和父类Clock,父类的成员变量是子类的对象,这就是类的交互。

//子类Display
public class Display {
	private int value =0;
	private int limit =0;
	//构造函数
	public Display(int limit)
	{
		this.limit=limit;
	}
	public void increase()
	{
		value++;
		if(value==limit)
		{
			value=0;
		}
	}
	public int getValue()
	{
		return value;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Display d= new Display(24);
		for(;;)
		{
			d.increase();
			System.out.println(d.getValue());
		}
	}
}

//父类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());
			//f表示带格式的输出;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Clock clock = new Clock();
		clock.start();

	}

}

2.2 访问属性

2.2.1 封装

  • 封装,就是把数据和对数据的操作放在一起,并且用这些操作把数据掩盖起来,是面向对象的基本概念之一,也是最核心的概念。

  • 我们有一个非常直截了当的手段来保证在类的设计的时候做到封装:

    • 1.所有的成员变量必须是private的,这样做避免了别人任意使用你的内部数据;
    • 2.所有的public函数,只是用来实现这个类的对象 或 类自己要提供的服务的,而不是直接用来访问数据的。除非对数据的访问就是这个类及对象的服务。简单的说:给每个成员变量提供一对用于读写的get/set函数也是不合适的设计。

2.2.2 封闭的访问属性

对象=属性+服务

数据:属性或状态;

操作:函数

private

//private 关键字只能用于成员变量  以及  成员函数!
//它表示 所修饰的成员是这个类所私有的。只有在类的内部才能对其进行访问;
//习惯上,所有的成员变量都应定义为私有的。
//私有,是针对类而不是对象的

2.2.3 开放的访问属性

Public

  • 任何人都可以访问;
    • “任何人”指的是在任何类的函数或定义初始化种都可以使用。
    • 使用指的是调用、访问或定义变量
    • 类的前面通常也会加public,表明任何人都可以用类的定义来定义变量;但是加了public的类必须保存在同名的.java文件里,否则会报错;

2.3 包package

  • 当你的程序越来越大的时候,你就会需要有一个机制来帮你管理一个工程中众多的类了。
  • 就是Java种类库的管理机制,它借助文件系统的目标来管理类库,一个包就是一个目录,一个包内的所有类必须放在一个目录下,那个目录的名字必须是包的名字。
  • 包的重要性: 作为Java程序员,你不能不懂包。要不然在使用别人的类库和部署你的程序的时候,会遇到不少莫名奇妙的麻烦。
  • 因为,包治百病呀
package clock;
import java.util.Scanner;
import display.Display;
//只要你用的哪个类不在当前包种,你就Import它;

2.4 类变量

  • 类是描述,对象是实体;
  • 在类里所描述的成员变量,是位于这个类的每一个对象中的。而如果某个成员有static关键字做修饰,它就不再属于每一个对象,而是属于整个类的了。
  • 通过每个对象都可以访问到类变量类函数,但也可以通过类的名字来访问它们。类函数由于不属于任何对象,因此也没有办法建立与调用它们的对象的关系,就不能访问任何非static的成员变量成员函数了。

2.4.1 类变量

​ 类的成员函数都不带static;

public class Display {
	private int value =0;
	private int limit =0;
	private static int step=1;
}
//比如我在定义Display类时,在变量step前面加上了 static 表示,step即为类变量;

慕课网翁恺老师《面向对象程序设计——Java语言》第二周对象交互——课程笔记_第2张图片

​ 若给成员变量 step 前面加上了step,则两个对象d1和d2对可以对static进行访问,也可以对static进行修改,一改双改。

2.4.2 类函数

public static void f(){
    value++;
}
//成员函数前面加上了static 便成了类函数;
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Display d1= new Display(10);
		Display d2 = new Display(20);
		d1.step=2;
		System.out.println(d1.step);
		System.out.println(d2.step);

	}
  • 类变量的初始化和对象的创建是没关系的;

你可能感兴趣的:(慕课网翁恺老师《面向对象程序设计——Java语言》第二周对象交互——课程笔记)