对象:一切皆对象,对象是由静态的属性和动态的方法(行为)组成。
类:一组具有相同属性和行为对象的抽象事物。
消息:对某个对象发送请求,比如,手机收到来电。
方法:对象收到请求的相应,比如,手机收到来电请求后会响铃或震动提示。
抽象:从一个具体的对象中提取一组数据,去除非本质和特征的属性,保留本质的共性的。
比如学生,有很多的属性(学号,姓名,性别,身高,血型,专业,班级,成绩),如果我们要做的是一个学生成绩管理系统,我们应该关注的是,除了学生的基本信息(姓名,性别),还要关注和学习相关的属性(学号,专业,班级,成绩)。不用关注学生的血型,身高,体重,而如果是一个学生健康管理系统,那么除了基本属性,身高,血型,体重,就是学生的本质属性。
封装:给对象一个边界,内部的信息尽量的隐藏,只留对外的操作接口。
2 类与对象
2.1 类和对象的定义与使用
类的定义:
Class类名{
数据成员-静态属性(私有)
成员函数-动态行为)(公有)
}
对象的定义:
类名 对象名
与int a的含义差不多
类定义的“{}”就是类的“外壳”,提供了封装,private声明的成员外面是不能访问的,而public可以。
引用:一个储存了某个对象地址的变量,它储存的不是对象本身,而是对象的地址。
Point point = new Point();的含义是,首先实例化一个对象(new point()),然后定义一个引用point指向这个实例。
point = point1含义:不是将实例point1赋值给point,而只是改变了引用的关系,即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.no);
静态常量,静态成员变量,静态成员方法,静态代码块。
静态方法没有this
静态方法只能访问静态成员
一般的成员都是通过构造函数去完成初始化(实例化对象时),而静态成员则是在加载类的时候(也就是实例化之前)初始化。
2.5 内部类
内部类是指在一个类的内部定义的类
内部类可以自由访问外部类的成员
内部类可以作为成员类(在外部类中定义,和成员方法平行)和方法内部类(定义在外部类方法里面)
内部类的实例化
Computer.Cpu cpu = new Computer().new Cpu();
在什么情况下使用内部类:当一个类离开了另一个类而无法单独存在或者说没有意义的情况下,使用内部类是合适的,比如CPU类离开了计算机类,单独存在就没有意义了。
类应该怎样去定义?
- 类的设计:考虑应该由哪些属性去描述这个类,这个类应该提供什么方法?
- 方法(函数)设计:函数名、参数和返回值的类型
如果需要返回多个结果,函数返回值如何设计?
- 可以将多个返回值融在一个结果中,用特定的值表示其中的一个结果,比如查找函数需要返回是否找到以及找到的话下标是多少,两个结果。可以将这两个结果并在一个整型返回值中,用-1表示没找到,找到的话就返回下标。这样设计的理由是下标不可能为-1,所以-1可以表示特定的含义。
- 将多个返回值封装成一个类对象
- 可以考虑使用输出型参数,在java中就只能使用引用类型了、
折回问题代码如下:
rear = (rear+1)%capacity;
/* rear++;
if (rear>=capacity){
rear = 0;
}*/