面向对象概述

版权声明:@2018 https://blog.csdn.net/weixin_40442684/article/details/81157248

面向对象基本概念

对象:一切皆对象,对象是由静态的属性和动态的方法(行为)组成。

类:一组具有相同属性和行为对象的抽象事物。

消息:对某个对象发送请求,比如,手机收到来电。

方法:对象收到请求的相应,比如,手机收到来电请求后会响铃或震动提示。

面向对象的基本特征

抽象:从一个具体的对象中提取一组数据,去除非本质和特征的属性,保留本质的共性的。

比如学生,有很多的属性(学号,姓名,性别,身高,血型,专业,班级,成绩),如果我们要做的是一个学生成绩管理系统,我们应该关注的是,除了学生的基本信息(姓名,性别),还要关注和学习相关的属性(学号,专业,班级,成绩)。不用关注学生的血型,身高,体重,而如果是一个学生健康管理系统,那么除了基本属性,身高,血型,体重,就是学生的本质属性。

封装:给对象一个边界,内部的信息尽量的隐藏,只留对外的操作接口。

 

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. 类的设计:考虑应该由哪些属性去描述这个类,这个类应该提供什么方法?
  2. 方法(函数)设计:函数名、参数和返回值的类型

如果需要返回多个结果,函数返回值如何设计?

  1. 可以将多个返回值融在一个结果中,用特定的值表示其中的一个结果,比如查找函数需要返回是否找到以及找到的话下标是多少,两个结果。可以将这两个结果并在一个整型返回值中,用-1表示没找到,找到的话就返回下标。这样设计的理由是下标不可能为-1,所以-1可以表示特定的含义。
  2. 将多个返回值封装成一个类对象
  3. 可以考虑使用输出型参数,在java中就只能使用引用类型了、

折回问题代码如下:

rear = (rear+1)%capacity;
/* rear++;
 if (rear>=capacity){
     rear = 0;
 }*/

猜你喜欢

转载自blog.csdn.net/weixin_40442684/article/details/81157248