OOP

面向对象

面向对象的本质就是:以类的方式组织代码,以对象的组织(封装)数据

创建与初始化对象

使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用

构造器

作用

实例化初始值

//有参构造:一旦定义了有参构造,无参就必须显示定义

  • 使用new关键字,本质是在调用构造器

  • 用来初始化值

//alt+insert 生成构造器 ok:有参 第二个无参

特点

和类名相同

没有返回值

this.当前对象

属性

字段Field 成员变量

默认初始化:

数字: 0 0.0

char:u0000

Boolean:false

引用:null

修饰符 属性类型 属性名 = 属性值!

属性赋值的先后顺序:

  • 默认初始化 //只能赋值一次

  • 显示初始化 //只能赋值一次

  • 构造器中赋值 //只能赋值一次

  • 通过“对象.方法”或:对象。属性“的方式,赋值 //可以赋值多次

顺序:1-2-3-4

 

封装

get/set

OOP

封装的意义

  1. 提高程序的安全性,保护数据

  2. 隐藏代码的实现细节

  3. 统一接口

  4. 系统可维护增加了

属性私有get/set

继承

extends

子类继承父类就会拥有父类的全部方法

CTRL + H (找到继承树)

Java中类只有单继承,没有多继承

super

调用父类的构造器,必须要在子类构造器的第一行。

注意点

  1. super调用父类的构造方法,必须在构造方法的第一个

  2. super必须只能出现在子类的方法或者构造方法中!

  3. super和this不能同时调用构造方法

对比this

代表的对象不同:

this:本身调用者这个对象

super:代表父类对象的应用

前提

this:没有继承也可以使用

super:只能在继承条件下才可以使用

构造方法

this();调用本类的构造

super();调用父类的构造

OOP

一个类有n个构造器,最多有n-1个this。剩的那个是super。也就是说在一个类的构造器中至少有一个super

方法的重写

重写都是方法的重写,和属性无关//重名属性保留基类的,重名方法保留子类的

父类引用指向子类

方法分调用只和左边,定义的数据类型有关。

静态方法和非静态方法区别很大。

重写产生于父类和子类之间,是指子类将父类的方法进行重写而重载是指同一个类中,可以因不同的参数类型,参数个数等可以写出多个相同名字的方法。

重写:需要有继承关系,子类重写父类的方法!

  1. 方法名必须相同

  2. 参数列表必须相同

  3. 修饰符:范围可以扩大但不能缩小: Public》Protected》Default》Private

  4. 抛出的异常:范围,可以被缩小,但不能扩大

  5. 重写,子类的方法和父类必要一致;方法体不同!

  6. 子类不能重写父类中private的方法

为什么需要重写:

父类的功能,子类不一定需要,或者不一定满足!

Alt + Insert ; override;

父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void

父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A 类的子类

父类被重写的方法的返回值类型是基本数据类型(比如:double,则子类重写的方法的返回值类型必须是相同的基本数据类型

多态

何为多态性:

对象的多态性:父类的引用指向子类的对象

多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法的调用

:有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。

编译看左边,运行看右边

多态的使用前提:

  • 类的继承

  • 方法的重写

对象的多态性,只适应于方法,不适用于属性

(类型转换异常:ClassCastException)

instanceof关键字的使用

格式:a instanceof A:判断对象a是否是类A的实例。如果是,返回ture;如果不是,返回false。

使用情景:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。

如果 a instanceof A返回true,则a instanceof B也返回true。

其中,类B是类A的父类。

===================================================================

若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中:编译看左边,运行看右边

对于实例变量和则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量:编译运行都看左边。

equals

== 和equals()的区别:

== :运算符

  1. 可以使用在基本数据类型变量和引用数据类型变量中

  2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)

  3. 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。

equals()方法的使用:

  1. 是一个方法,而非运算符

  2. 只能适用于引用数据类型

  3. Object类中定义的equals()和==的作用是相同的

  4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。

  5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object类中的equals()进行重写

    重写规则,比较两个对象的实体内容是否相同

    toString

    1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()

    2. Object类中toString()的定义:

    public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
  6. 像String、Date、File、包装类等都重写了Object类中的toString()方法。

使得在调用对象的toString()时,返回“实体内容”信息

  1. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”

包装类

包装类的使用:

  1. Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征

  2. 掌握的:基本数据类型、包装类、String三者之间的相互转换

基本数据类型、包装类---》String类型:调用String重载的valueOf(Xxx xxx)

String类型---》基本数据类型、包装类:调用包装类的parseXxxx(Strig s)

static

static关键字的使用

  1. static:静态的

  2. static可以用来修饰:属性、方法、代码块、内部类

  3. 使用static修饰属性:静态变量

    - 属性,按照是否使用static修饰,又分为:静态属性和非静态属性(实例变量)

实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。

静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他的对象调用此静态变量时,是修改过了的。

  • static修饰属性的其他说明:

    静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用

    静态变量的加载要早于对象的创建

    由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中

  • 使用static修饰方法:静态方法

随着类的加载而加载,可以通过“类.静态方法”的方式进行调用

静态方法中,只能调用静态的方法或属性

非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

  • static注意点:

在静态的方法内,不能使用this关键字、super关键字

  • 开发中,如何确定一个属性是否要声明为static

属性是可以被多个对象所共享的,不会随着对象的不同而不同的

类中的常量也常常声明为static

开发中,如何确定一个方法是否要声明为static

操作静态属性的方法,通常设置为static的

工具类中的方法,习惯上声明为static的

 

 

 

 

 

 

 

上一篇:面向对象程序设计(OOP)的三大基本特征(定义、特性、优缺点、java中的表现形式及应用)和五大基本原则


下一篇:c++学习笔记(八)—— oop相关