Mooc翁恺-Java面向对象程序设计 第二周 对象交互

2022-07-19 17:21:15 浏览数 (1)

第二周 对象交互

本文是观看翁恺老师《面向对象程序设计Java》时所做

视频来源-中国大学Mooc网

@TOC

2.1 对象交互

面向对象程序设计的第一步,就是在问题领域中识别出有效的对象,然后从识别出的对象中抽象出类来。面对纷繁复杂的现实问题,往往存在多种对象划分的方式,而不同的划分会带来类的设计以至于程序结构的各种不同。对象划分有一些理论,但是不是这门面向对象的入门课程能覆盖的。而且目前的理论也还不是放诸四海皆准的简单操作指南。我们举了一个数字钟的例子,希望通过这个例子表明对象划分的重要性,给你一个感性认识。在今后面对实际的问题领域时,可以试试用这里提到的概念来做对象的划分和类的设计。但是这只是一个例子,遇到具体情况一定是具体分析,按照问题领域的实际情况来做。

一个对象当然可以由其他类的对象来组成,就像一个人体里面有心脏、肠胃一样。对象是由其他对象组成的,而类定义了这样的组合关系。

那么下一个问题,就是当一个对象里有多个对象的时候,那些对象之间是如何交互的,对象和对象之间的联系是如何建立的,对象如何和其他对象交流。对象和对象之间的联系紧密程度叫做耦合。对象和对象的耦合程度越紧,表现在源代码上,就是它们的代码是互相依赖、互相牵制的。我们理想的模型,是对象和对象之间的耦合要尽可能的松,平行的对象要尽量减少直接联系,让更高层次的对象来提供通信服务。这些就是在我们这个非常简单的数字钟的例子中所体现的。

要实现一个数字钟非常简单,如果只是实现功能,入门课程里的一个循环就可以了。这里所体现的,是更深层次的面向对象设计的理念。

本周我们还只是初步接触这些理念,后面还有机会更深入地认识和理解它们。

2.1.1 对象的识别

怎么实现一个时钟?

在这里插入图片描述在这里插入图片描述

用面向对象的思维方式!

在这里插入图片描述在这里插入图片描述

Display.java

代码语言:java复制
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);
//		while(true)
//		{
//			d.increase();
//			System.out.println(d.getValue());
//		}
		
		Display hour = new Display(24);
		Display minute = new Display(60);
		while(true)
		{
			minute.increase();
			if( minute.getValue()==0 )
			{
				hour.increase();
			}
			System.out.printf("d:dn", hour.getValue(), minute.getValue());
		}

	}

}

2.1.2 对象的交互

Clock.java

代码语言:java复制
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("d:dn", hour.getValue(), minute.getValue());
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Clock clock = new Clock();
		clock.start();

	}

}

2.2 访问属性

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

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

  1. 所有的成员变量必须是private的,这样就避免别人任意使用你的内部数据;
  2. 所有public的函数,只是用来实现这个类的对象或类自己要提供的服务的,而不是用来直接访问数据的。除非对数据的访问就是这个类及对象的服务。简单地说,给每个成员变量提供一对用于读写的get/set函数也是不合适的设计。2.2.1 封闭的访问属性(private)private
  3. 只有在这个类内部可以访问
  4. 类内部指类的成员函数和定义初始化
  5. 这个限制是对类的而不是对对象的

2.2.2 开放的访问属性(public)

一个文件中只能有一个public类

一个编译单元最多只能有一个public类

问题:为什么说private是对类的不是对对象的?

这话到底是什么意思?private的访问属性到底限制的是什么?

代码语言:java复制
当成员变量被设为private时,private限制的是其他类使用当前类所创建的对象作为成员变量时,不可以访问此对象的类成员变量,也就是说这种情况就属于跨类访问,限制类。

而当属于同一个类时,只要在类的范围内,例如成员函数中可以调用同一类所创建的对象的成员变量,这种属于相同类的不同对象,不限制对象。

综上结合起来就是限制类不限制对象

2.3 包 -- 包是Java的类库管理机制

当你的程序越来越大的时候,你就会需要有一个机制帮助你管理一个工程中众多的类了。包就是Java的类库管理机制,它借助文件系统的目录来管理类库,一个包就是一个目录,一个包内的所有的类必须放在一个目录下,那个目录的名字必须是包的名字。

作为初学者,你可以忽略不看包,反正一切靠Eclipse。但是作为一个Java程序员,你不能不懂包。要不然,在使用别人的类库和部署你的程序的时候,会遇到不少莫名其妙的麻烦。

因为,包治百病啊!

没有public的类中函数默认是friendly,只有同一个包下的类可以进行访问。

不同包下的类使用时需要import进行导入

这就是Java类库的管理方式

2.4 类变量(static

类是描述,对象是实体。在类里所描述的成员变量,是位于这个类的每一个对象中的。

而如果某个成员有static关键字做修饰,它就不再属于每一个对象,而是属于整个类的了。

通过每个对象都可以访问到这些类变量和类函数,但是也可以通过类的名字来访问它们。类函数由于不属于任何对象,因此也没有办法建立与调用它们的对象的关系,就不能访问任何非static的成员变量和成员函数了。

2.4.1 类变量

  • 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
  • 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static类型的变量。静态变量初始化后不可改变。
  • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
  • 静态变量在第一次被访问时创建,在程序结束时销毁。
  • 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
  • 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
  • 静态变量可以通过:ClassName.VariableName的方式访问。
  • 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和final 类型,其命名方式与实例变量以及局部变量的命名方式一致。

2.4.2 类函数

  • static修饰的函数,不属于任何对象,只属于这个类!
在这里插入图片描述在这里插入图片描述
  • static只能调用被static修饰的函数,只能去调用static的成员变量

在类函数中有this吗?为什么?

代码语言:txt复制
没有,this是针对对象的,而类函数是针对整个类的

0 人点赞