MOOC 浙江大学 面向对象程序设计-Java笔记(2)

------------翁恺老师授课
第二次课程 对象交互

一. 对象交互

设计程序:

  1. 在问题领域识别出有效的对象;
  2. 从对象中抽象出类。

如何划分出对象并设计类呢?
--寻找不同对象之间的相似不同
可以用一个类(类A)的 n 个对象去构建另一类(类B),也就是说类B的对象包含 n 个类A的对象,(对象组成了新的对象)。

public class 类B{
	类A 对象变量1 = new 类A();//一个类的成员变量可以是其它类的对象
	类A 对象变量2 = new 类A();
	类A 对象变量3 = new 类A();
	.......
	类A 对象变量n = new 类A();
	
	方法1 ...
	方法2 ...
	方法3 ...
}

public static void main(String[] args) {
	类B 对象变量 = new 类B();
}

此时,考虑以下几个问题:
(1)对象之间是如何交互的?
(2)对象和对象之间的联系是如何建立的?
(3)对象如何和其他对象交流?
理想的模型是每一个类,每一个对象都尽可能地独立。平行对象要尽量减少联系,让更高层次的对象来提供通信服务。

二. 访问属性

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

在这里插入图片描述

  1. private
  2. public
  3. provated
  4. 默认

1 private

尽量做到所有的成员变量必须是private,避免内部数据被使用。

public class 类A {
	private int value = 0;
	private int limit = 0;
	....
}

类A内 private 类型只有类A的内部(class 的大括号内都是类的边界)可以使用,一般在类A的成员函数中可以使用,并且可以用于初始化类A内的其他成员变量。

public class 类A {
	private int value = 0;
	private int limit = value;//<---注意
	....
	public void addValue()
	{
		value++;//<----
	}
}

类A的private类型成员变量的访问限制针对于其他类(如类B),而不限制类A的对象。类A的所有不同的对象之间可以访问彼此的私有成员变量。

public class Fraction{
	private int a;
	private int b;
	Fraction plus(Fraction r)
	{
		int a = 0;
		int b = 0;
		a = this.a * r.b + r.a * this.b;//类A内部,r是传入的类A对象(*╹▽╹*)。
		b = this.b * r.b;
		return new Fraction(a, b);
	}
	.......
}

2 public

  1. 类中的public:任何人都可以访问,任何人指的是在任何类的函数或定义初始化中可以调用,访问或定义变量。类中函数一般是 public 类型,类自己要提供的操作。
public class 类A{
	private 类B var1 = new 类B();
	private 类B var2 = new 类B();
	var1.a ... //此时无法调用,因为在类A的内部中 类B的私有成员变量是不可见的。
	var1.addValue()....//可以调用,类B的操作是公有的。
}
class 类B{
	private int a = 0;
	private int b = 0;
	public void addValue(){
		a++;
	}
	.....
}
  1. public修饰类:一个编译单元中只能存在一个public类型的类,且该类的标识符必须与该编译单元(一个.java文件)文件名一致。其余类只能使用private、默认、protected类型修饰。

3 默认类型

类内 默认类型的函数可以被同一类中的其他成员或者同一个包中的其他类访问。

第一条很容易得知,对于第二条,同一个包意味着这些类处于同一层目录下(类Clock与类ClockTest在同一个包中,该包为Week2Clock)。

包: 一个包内的所有类必须放在一个目录下,只有用到的类与当前类不在同一个包内,就需要import 包.类,或使用类的完整名字。不推荐使用import 包.*,易导致重名问题。“.”表示文件系统层次。
在这里插入图片描述

4 protected 学习到继承相关内容时再补充

三. 类变量和类函数

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

public class {
	private int value = 0; //成员变量
	private int limit = 0; //成员变量
	private static int step = 1;  //类变量
	
	public static void add() {//类函数
		step++;
	}
}

类变量和类函数会被类的所有对象共享,其初始化在类的装载时完成,与对象的创建无关。

对象是没有类变量和类函数的(下图的minute对象和hour对象中均不含类变量step),只是因为对象知道自己属于哪一个类,有办法调用到类变量。
注意: (1)通过每个对象都可以访问到这些类变量和类函数,但应该通过类的名字来访问它们。(2)类函数由于不属于任何对象,因此也没有办法建立与调用它们的对象的关系,就不能访问任何非static的成员变量和成员函数了。
在这里插入图片描述

随着后续的深入,我会继续修订此部分。
未完待续,加油ヾ(◍°∇°◍)ノ゙!!!

原文地址:https://www.cnblogs.com/yuecheng/p/12577405.html