Java进阶之对象交互

  • 对象交互
  • 类变量
  • 类函数


对象交互

1.直接引入钟表实例:两个Display类的对象hour,minute构成了新的对象clock,且clock对象属于Clock类。那么我们在定义Clock类的时候,在其成员变量的定义中要写出两个Display类的对象的创建过程,这样的话我们在创建Clock类的对象的时候,此对象才会包含两个Display类的对象,如下图代码所示。

【Display类的定义】

Java Display类 java display类怎么写_class


【Clock类的定义】

Java Display类 java display类怎么写_java_02


2.一个类定义的时候,其成员变量是可以包含其他类的对象的建立过程的,这样做的结果就是这个类创建的对象,都包含几个其他类的对象。(也就是这个对象是由其他类的对象构成的)

3.private和public只能用于成员变量和成员函数,不能同于本地变量。private是指该成员变量/成员函数是这个类所私有的:假如是私有的成员变量,则只能在类的内部去访问,比如在成员函数里面被访问或者在其他新的成员变量被定义的时候被访问,或者在这个类里面的主函数中(main函数中)被访问;私有的是成员函数也是类似。public是指该成员变量/成员函数是公开的,任何人都可以去访问和调用。 还有第三种情况,假如成员变量和成员函数前既没有public也没有private,那说明该成员变量或成员函数是Friendly类型的,处于同一个包(后面会详细解释什么叫做包,现在可以简单理解为同一个工程目录下)里的类都可以访问这个成员变量/成员函数。 此外还有一个类型是protected,会在我们后面学习继承的时候再了解。

4.所有的成员变量,除非有非常合理的理由,都应该被设置为private,这样才能保护这些变量不被外界随意使用。并且这个private私有是针对类来说的,只能在类的内部被访问,在外部不能被调用。切记不是对对象的限制,也就是说,同一个类的所有的不同对象之间可以互相访问对方的私有成员。

5.★★★除了类的成员变量/成员函数前面有public/private关键字,在类的前面(class)一般也是有public关键字的,此时表明任何人都可以用这个类来定义变量(对象),此时也要求这个前面有public标识的类必须处在一个源代码文件里,且这个源代码文件的文件名必须和这个类的名字相同,否则会报错。
6.一个源代码文件被称为一个编译单元, 编译的时候一次只能对一个编译单元做编译动作,在一个编译单元里面可以有很多java类,但是只有一个类前面可以加上public标识符(也可以没有这个加public的类,如果有的话则需要符合第五点的要求),其他类前不加public,也就是Friendly类型,则这个类只能在这个包里面起作用,名字也不需要和该编译单元的名字相同(相同应该也不会报错)。

7.包(package),一般是在工程文件中的src文件目录下(在eclipse中是可以看出来的),对应的包目录下面才是刚刚所讲的编译单元/源代码文件。

8.注意:每一个源代码文件的最上方都会用“package 包名;”的形式表明此源代码在哪个包里,这是系统自动生成的。成员函数或者成员变量的public是公开的,private是局限于类的内部,不加(也就是friendly)是局限于包内部;类前面加了public是公开的,不加(也是friendly类型)也是局限于包同一个内使用。调用的时候要注意,不能出错。假如一个包目录下的编译单元(类)调用了另外一个包目录下的编译单元(类),则系统会在代码最上方的第二行自动生成“import 包名.编译单元名(或者说类名);”这种格式的说明。④如果不写import…也可以,只需要在该编译单元(类)下面把下面把另外一个被调用的编译单元(类)的名字补全,也就是前面加上“包名.”,这样也是可以的。比如:

Java Display类 java display类怎么写_class_03


⑤如果把“import 包名.编译单元名(或者说类名); ”中的编译单元名(类名)改成“*”,作为通配符,也可以用,但是万一遇到一些重名的东西,可能会产生冲突。

注:我们最推荐的就是第一种方式(也就是③)

9.假如新建的package的命名是,“已经定义过的包名.新的包名”这种形式,则是在一个包里面建立了另外一个更深层的包(不是严格在src的目录下了)

类变量

1.一般来说,一个类中成员变量的定义格式是“ private/public/不加 成员变量类型 成员变量名称=初始值 ”,如果在“ private/public/不加” 后面多了一个“static”,此时这个变量就不是成员变量了,而是类变量,它属于这个类,不单独属于某个对象,所有该类的对象都能通过 “ 对象名.类变量 ” 对这个变量共同进行管理,注意“ 对象名.类变量 ”并不表明该类变量是该对象的成员变量,而是指这个对象对这个类自带的类变量的访问和管理, 只要有一个对象访问类变量时使其产生了变化,所有其他对象访问类变量时,该类变量都会有相同的变化,也就是变化是整体的。 自己理解好就行,没必要这么复杂,其实就两点,可以通过类直接访问或者通过对象来访问(不表示是这个对象的成员变量,而是指对类自带的类变量的访问和管理),且做出的变化是整体的。

2.一般说来,只能通过对象来访问各自的成员变量,比如下面图示例子中对成员变量的访问都是d1.value、d2.value等等,Display.value是不被允许的。而对于类变量来说有两种访问方式,一种是可以直接通过类来访问,比如下面例子中的Display.step,此方式访问对step做出的更改是整体的。其次也可以通过某对象来访问,比如d1.step,但是要注意对step做出的更改也是整体的,所有对象中的step都改变了。

实例如下图所示:step的初始值为1

Java Display类 java display类怎么写_java_04


Java Display类 java display类怎么写_class_05

类函数

1.成员函数(不需要加static)也必须通过对象来调用。

2.假如 “成员函数” 的 “public/private/不加 ”后面多了 “static”此时就不是成员函数了,而是类函数,属于这个类,而不是属于某个对象。类函数的调用有两种方式(跟类变量类似),可以在有static的主函数中直接被调用,也可以在此主函数中通过对象来调用(也不表示是这个对象的成员函数,只是表示对象对类自带的类函数的访问)。

Java Display类 java display类怎么写_成员变量_06


3.有一个重要原则,static类函数只能在static类函数中被调用,类函数中也只能调用static类变量。

4.类变量只会在类的装载的时候(类进入到程序里面去的时候),被初始化,和对象的创建没有丝毫关系,如下图输出是2。

Java Display类 java display类怎么写_Java Display类_07