前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mooc翁恺-Java面向对象程序设计 第二周 对象交互

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

原创
作者头像
Dwayne
发布2022-07-19 17:21:15
3350
发布2022-07-19 17:21:15
举报

第二周 对象交互

本文是观看翁恺老师《面向对象程序设计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("%02d:%02d\n", 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("%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 访问属性

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

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

  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是针对对象的,而类函数是针对整个类的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二周 对象交互
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档