2.1 类和对象的定义与使用
类的定义:
Class 类名{
数据成员-静态属性
成员函数-动态行为
}
对象的定义:
类名 对象名
与 int a的含义差不多
类定义的“{}”就是类的“外壳”,提供了封装,private声明的成员外面是不能访问的,而public可以。
引用:一个储存了某个对象地址的变量,它储存的不是对象本身,而是对象的地址。
Point point=new Point();的含义是:首先实例化一个对象(new Point()),然后定义一个引用point指向这个实例。
point=point1
不是讲实例point赋值给point1,而只是改变了引用的关系,即point也指向了point1指向的实例
2.2 构造函数和垃圾回收
为什么需要有构造函数?
构造函数是完成对象的初始化,这个当然可以定义一个成员方法予以实现。但是这个方法必须显式调用,否则就可能因未初始化出现错误。
我们希望这样的方法能够被自动调用,能被自动调用,那么它的名字一定是独一无二的,什么样的名字才是独一无二的呢?——以类名作为方法名。这就是构造函数。
构造函数,是在对象实例化时自动被系统调用,该函数名必须独一无二。对于一个类来说,就是将一个类名作为函数名。
构造函数不需要程序员去定义返回值,他是系统自动决定的,void也不行。
构造函数无法、也无需指定指定返回值,它是自动被调用的。
函数重载
多个函数使用同一个函数名,系统根据参数自动调用相应的函数。
函数重载解决了标识符统一的问题。
拷贝构造函数
用一个已经存在的本类的对象去复制新的对象
垃圾回收:所谓的“垃圾”是指之前系统分配的内存单元,但是现在没用了,
再具体的讲,就是没有引用指向它。对于“垃圾”来讲,程序员不需要自己去回收,而是系统提供的垃圾回收机制自动回收,当程序员觉得有必要时,也可以强制让系统回收。
2.3 访问权限控制和封装
方法的访问控制(四种访问权限):
封装的要领,是站在用户的角度去思考怎么去描述一个类,它应该有什么属性和行为,而不是去考虑如何实现。
2.4 静态
静态成员修饰的成员与一般的成员有何区别呢?
一般的成员是每个对象有一份数据,而静态成员是属于类的,即所有对象所共享;
一般成员的访问方式:对象名.成员名,而静态成员的访问方式:类名.成员名。
this是“这个”、“当前”的意思,每一个成员方法都隐含有一个参数(this)。
比如
public void print(){
System.out.println("学号:"+sno);
System.out.println("姓名:"+name);
System.out.println("性别:"+(sex==MALE?"男":"女"));
System.out.println("学历:"+(level==UNDERGRADUATION?"本科":"专科"));
}
中的
严格来讲,应该写成
System.out.println("学号:"+sno);
System.out.println("学号:"+this.sno);
静态常量,静态成员变量,静态成员方法,静态代码块
静态方法没有this
静态方法只能访问静态成员
一般的成员都是通过构造函数去完成初始化(实例化对象时),而静态成员则是在加载类的时候(也就是实例化之前)初始化
2.5 内部类
内部类是指在一个类的内部定义的类
内部类可以自由访问外部类的所有成员
内部类可以作为成员类(在外部类中定义,和成员方法平行)和方法内部类(定义在外部类的成员方法里面)。
内部类的实例化:
Computer.Cpu cpu=new Computer().new Cpu();
System.out.println(cpu.getY());
当一个类离开另一个类而无法单独存在或者说没有意义的情况下,使用内部类是最合适的(如:CPU离开计算机类,单独存在就没有意义了)
面对对象设计
(1)类的设计:考虑应该由哪些属性去描述这个类,这个类应该提供什么方法?
(2)方法(函数)设计:函数名、参数和返回值类型
如果需要返回多个结果,函数返回值如何设计
(1)可以将多个返回结果融在一个结果中,用特定的值表示其中的一个结果。比如查找函数需要返回是否找到以及找到的话下标是多少两个结果。可以将这两个结果并在一个整型返回值中,用-1表示没找到,找到的话就返回下标。这样设计的理由是下标不可能为-1,所以-1可以表示特定的含义。
(2)将多个返回值封装成一个类对象
(3)可以考虑使用输出型参数,在Java中就只能使用引用类型了。