面向对象设计的三个主要特征:封装性(内部的操作对外部不可见)、继承性(在已有结构的基础上继续进行功能的扩充eg:手机开始的通话短信之上)、多态性(是在继承性的基础上扩充而来的概念,指的是类型的转换处理)
在进行面向对象程序的开发之中一般还有三个步骤:
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程
面向对象设计的两大核心:类与对象
类是对某一类事物的共性的抽象概念,而对象描述的是一个具体的产物
类是一个模板,而对象才是类可以使用的实例,先有类再有对象
在类之中一般都会有两个组成:
成员属性(Field):有些时候为了简化称其为属性
——一个人的年龄、姓名都是不同的,所以这些对于整体来讲就称为属性
操作方法(Method):定义对象具有的处理行为
——这个人可以唱歌、跳舞、游泳
在有了类之后,如果要产生对象,那么必须使用如下的语法格式来完成
1、声明并实例化对象:类名称 对象名称=new 类名称();
2、分步骤完成:
声明对象:类名称 对象名称=null(类是引用类型,初始值为null)
实例化对象:对象名称=new 类名称()
如果不赋值,则系统会使用默认值
内存分析
声明对象后,必须实例化才能执行,不然会出现NullPointerException(空指向异常)只有引用数据类型会存在此种异常
类中的所有属性都必须使用private封装,并且属性如果要进行访问就必须要提供有setter、getter方法
可以通过构造方法实现实例化对象中的属性初始化处理
在Java程序中,构造方法的定义要求如下:
构造方法名称必须与类名称保持一致
构造方法不允许设置任何的返回值类型,即:没有返回值定义
构造方法是在使用关键字new实例化对象的时候自动调用的
一个类至少存在有一个构造方法,永恒存在。如果类中没有定义构造方法,则编译过程中会自动创建,如果类中定义有构造方法,则不会自动创建
疑问:为什么构造方法上不允许设置返回值类型?
既然构造方法是一个方法,那么为什么不让它定义返回值类型呢?
既然构造方法不会返回数据,为什么不使用void定义呢?
分析:程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的
如果在构造方法上使用了void,那么此结构就与普通方法的结构完全相同了,这样编译器会认为此方法是一个普通方法,普通方法与构造方法最大的区别就是:构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。
方法本身就具有重载的特点
setter除了可以设置数据外,还可以更改数据,用法上比构造方法更灵活
只要是方法都可以传递任意的数据类型(基本数据类型、引用数据类型)
当前类中的属性:this.属性;
当前类中的方法(普通方法、构造方法):this()、this.方法名称()
描述当前对象
在Java程序之中“{}”是作为一个结构体的边界符,那么在程序里面当进行变量(参数、属性都称为变量)使用的时候都会以“{}”作为一个查找边界。所以按照就近取用的原则,此时的构造方法并没有能够访问类中的属性,所以此时为了明确的标记出类中的属性与参数的区别,往往会在属性前追加一个“this”,表示本类属性
如果要想评价一个代码的好坏:
代码结构可以重用,提供的是一个中间独立的支持
我们的目标是:没有重复
对于本类构造方法的互相调用需要注意以下几点重要问题:
构造方法必须在实例化新对象的时候调用,所以“this()”的语句只允许放在构造方法的首行
构造方法互相调用时请保留有程序的出口,别形成死循环
对于简单Java类而言,其核心的开发结构如下:
类名称一定要有意义,可以明确的描述某一类事物
类之中的所有属性都必须使用private进行封装,同时封装后的属性必须要提供有setter、getter方法;
类之中可以提供有无数多个构造方法,但是必须要保留有无参构造方法
类之中不允许出现任何的输出语句,所有内容的获取必须返回
【非必须】可以提供一个获取详细信息的方法,暂定该方法为getinfo()
但是对于static属性的访问需要注意一点:由于其本身是一个公共的属性,虽然可以通过对象进行访问,但是最好的方法应该是通过所有对象的最高代表(类)来进行访问。所以static属性可以由类名称直接调用
static属性虽然定义在类之中,但是其并不受到类实例化对象的控制。static属性可以在没有实例化对象的时候使用
static方法只允许调用static属性或static方法
非static方法允许调用statc属性或static方法
static定义的方法或者是属性都不是你代码编写之初所需要考虑的内容,只有在回避实例化对象调用并且描述公共属性的情况下才会考虑使用static定义的方法或者是属性