JAVA面向对象三大特性

JAVA面向对象三大特性


Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案。

一,面向对象

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向对象:主要关注点是:主要关注对象(独立体)能完成哪些功能。

优点:耦合度低,扩展力强,更容易解决现实世界当中更复杂的业务逻辑。

缺点: 性能比面向过程低

C语言是纯面向过程的语言

C++半面向对象

Java纯面向对象

面向对象生命周期

面向对象的方式开发一个软件,生命周期可分为三个阶段:

面向对象的分析:OOA

面向对象的设计:OOD

面向对象的编程:OOP

二,封装

概念:

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

封装步骤:

1,所有属性私有化,使用private关键字进行修饰,修饰的所有数据只能在本类中访问

2,对外提供简单的操作入口,

对外提供两个公开的方法:get和set

1)get方法命名规范:

eg: public int getAge(){

​ return age

}

2)set 方法命名规范:

eg: public void setAge(int a){

​ age=a;

}

注意:setter and getter方法没有static关键字

有static 关键字修饰的方法调用:类名.方法名(实参) 。 eg: newc.age=30;

没有static 关键字修饰的方法调用:引用.方法名(实参)。 eg: newc.setAge(30) , newc.getAge()

一个属性通常访问的形式:

1,读取这个属性的值:get

2,修改这个属性的值:set

get方法根据方法需要,提供相应的返回值

set方法没有返回值,因为set方法只负责修改属性值

封装步骤图例:

在这里插入图片描述

关于JAVA关键字

Java 的访问权限修饰关键字。Java 中主要有 private、protected、public 和 默认访问权限 四种:

public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。

protected 修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。

default 修饰符,主要是本包的类可以访问。

private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。

在这里插入图片描述

this关键字

this是一个关键字,

thisj 一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。每创建一个对象都有其对应的this

this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象。(this 代表当前对象)

this在多数情况下可以省略不写,

this 不能使用在带有static的方法中

return this;可以用于返回本类对象的方法的操作

this(参数列表)调用具有对应参数列表的构造方法

构造方法:

  • 1,构造方法:又称构造函数、构造器,constructor
  • 2,构造方法语法结构:
[修饰符列表] 构造方法名(形参列表){
	构造方法体
}
  • 3,普通方法的语法结构:
[修饰符列表] 返回值类型  方法名(形参列表){
	方法体
}
  • 4,对于构造方法来说,“返回值类型”不需要指定,并且不能写void,只要写上void,则这个方法变成普通方法

  • 5,对于构造方法来说,构造方法名必须与类列保持一致

  • 6,构造方法的作用:通过构造方法的调用,可以创建对象

  • 7,构造方法的调用:

    • 普通方法的调用:方法修饰符中有static时,类名.方法名(实参列表);方法修饰符中没有static时,引用.方法名(实参列表)
    • 构造方法调用: new 构造方法名(实参列表)
  • 8,构造方法调用执行之后,都有返回值,但这个return是隐式的,系统自动返回,不需要再编写return语句,返回值是他本身。

  • 9,当一个 类中没有定义任何构造方法时,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。

  • 10,当一个类显示的将构造方法定义出来,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动提供无参构造方法,因为无参数构造方法太常用。

  • 11,构造方法支持重载机制,在一个类当中编写多个构造方法,这多个构造方法就构成方法重载。

    • 只要构造函数调用就会创建对象,并且一定是在”堆内存“中开辟内存空间。

构造方法作用:

1,创建对象

2,创建对象的同时,初始化实例变量的内存空间

成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量

实例变量没有手动赋值时,系统默认赋值,

3,实例变量什么时候完成初始化?

在类加载时,只加载了代码片段,没有创建对象,所以实例变量此时并没有初始化。

实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的,完成初始化的。

系统默认赋值是,也是在构造方法执行过程当中完成的赋值。

三,继承

概念:

一个新类从已有的类那里获得其已有的属性和方法,这种现象叫类的继承。
(这个新类被称为子类,也叫派生类,已有的那个类叫做父类,也叫做基类。)

语法结构:

class 子类 extends 父类{}

如:B继承A类的所有属性和方法

注意:私有属性和方法不能被继承。

class A{
public void f(){
System.out.println(“AAAA\n”);
}}

class B extends A{
public void f(){
super.f();
System.out.println(“BBBB\n”);
}}

在这里插入图片描述

继承与扩展

子类拥有父类非private的属性,方法。

子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

子类可以用自己的方式实现父类的方法或者属性–重写。

Java只能单继承,不能多继承。但是可以多重继承。

方法的重载

1,方法重载又称为Overload

2,方法重载什么时候使用

当在同一个类当中,方法完成 的功能是相似的,建议方法名相同,方便编程,如同在调用 一个方法。

3,怎么样构成 方法重载?

在同一个类当中,

方法名相同

参数列表不同:类型,顺序,个数

4,方法重载与什么无关

与方法的返回值类型无关

与方法的修饰符列表无关

方法的覆盖

1,方法覆盖又称为Override/Overwrite

2,什么时候使用方法重写?

当父类中的方法已经无法满足当前子类的业务需求

子类有必要将父类中继承过来的方法进行重新编写

这个重新编写的方法的过程称为方法重写/方法覆盖

3,什么条件满足方法重写?(代码在什么条件下,构成方法的覆盖)

方法重写发生在具胡继承关系的父子类之间

方法重写的时候,返回值 类型相同,方法名相同,形参列表 相同

方法重写时,访问权限不能更低,可以更高

方法重写时,抛出异常不能更多,可以更少

4,建议方法重写的时候尽量复制粘贴,不要编写,避免出错

5,注意:

私有方法不能继承,所以不能覆盖

构造 方法不能继承,所以不能覆盖

静态方法不存在覆盖。

覆盖只针对方法,不针对属性

final关键字

使用final关键字做标识有“最终的”含义。

1. final 修饰类,则该类不允许被继承。

2. final 修饰方法,则该方法不允许被覆盖(重写)

3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在**构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),**且初始化之后就不能改了,只能赋值一次

4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量

super关键字

在对象的内部使用,可以代表父类对象。

1、访问父类的属性:super.age

2、访问父类的方法:super.eat()

super的应用:

首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。

这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。

那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行

继承和类实例化过程

(1)在多个不同的类中抽取出共性的数据和逻辑,对这些共性的内容进行封装一个新的类即父类(也叫做超类或基类),让之前的类来继承这个类,那些共性的内容在子类中就不必重复定义,比如 BaseDAO、BaseAction 等。

* (2)Java 的继承机制是单继承,即一个类只能有一个直接父类。

* (3)如果子类和父类有同名成员变量和方法,子类可以使用 super 关键字调用父类的成员变量和方法,上述使用方式前提是成员在子类可见。

* (4)在调用子类构造方法时,会隐式的调用父类的构造方法 super()。如果父类没有无参构造方法,为了避免编译错误,需要在子类构造方法中显式的调用父类的含参构造方法。

(5)子类创建时调用父类构造方法:子类需要使用父类的成员变量和方法,所以就要调用父类构造方法来初始化,之后再进行子类成员变量和方法的初始化。因此,构造方法是无法覆盖的。

* (6)当子类需要扩展父类的某个方法时,可以覆盖父类方法,但是子类方法访问权限必须大于或等于父类权限。

(7)继承提高了程序的复用性、扩展性,也是 Java 语言多态特征的前提。

(8)在实际开发、程序设计过程中,并非先有的父类,而是先有了子类中通用的数据和逻辑,然后再抽取封装出来的父类。

四,多态

概念:

多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

实现多态的技术称为:动态绑定(dynamicbinding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

作用:

消除类型之间的耦合关系。

多态存在的三个必要条件

多态存在的三个必要条件

一、要有继承;

二、要有重写;

三、父类引用指向子类对象。

多态的好处:

1)可替换性(substitutability):多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

2)可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

3)接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。

4)灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。

5)简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

6.Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。

7.Java中多态的分类:

在java中,多态大致可以分为以下几种情况:

1)person为父类,student为子类。那么:personp=newstudent();

2)fliable为接口,bird为实现接口的类,那么:fliablef=newbird();

3)fliable为抽象类,bird为继承fliable的类,那么:fliablef=newbird();

多态时需要说明p声明为父类的引用,但他实际为子类引用。但是他只能调用父类中的方法。如果子类中的方法覆盖了父类方法,那么将调用父类方法(虚方法调用)。接口多态也是同样的,也许你会问,如果f要调用自己的方法,那岂不是出错了?其实这里也是方法的覆盖,因为实现接口的子类肯定会实现接口中的方法,所以此种情况下调用的是bird中的方法。但是如果bird有一个方法在接口中没有定义,那么f不能调用。

本质:多态的本质就是将子类对象赋值给父类变量,在运行时期会表现出具体的子类特征(调用子类的重写方法)。

例如:我家里养了一只动物,叫乖乖…

乖乖是狗 发了了汪汪的叫声

是猫 发了喵喵…

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

参考文档:https://www.cnblogs.com/hysum/p/7100874.html

https://www.cnblogs.com/xugf/p/8475931.html

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值