Java — 面向对象
发布日期:2021-06-30 19:49:41 浏览次数:2 分类:技术文章

本文共 4242 字,大约阅读时间需要 14 分钟。

一、面向对象

1、面向对象的编程思想(

在实际生活中,我们往往要重复做一件事情,比如吃饭,前提条件是有饭可吃,我门就要做饭,做饭是要方法的(一个函数),那么这个方法(函数)是怎么实现的呢?首先要买菜,然后洗菜,之后再做菜、淘米、做饭,如果还要玩玩浪漫再开一瓶红酒等等啦...当每天都重复这个做饭的过程的时候,我们就会烦烦烦...那么,如果我们将做饭这个方法封装起来,不用每次做饭的时候都去写一样的代码,这多方便哈。

当然我们不可能天天吃茄子吨土豆、也不可能天天吃鸡蛋炒西红柿、所以聪明的我们这些吃货就将这些醋溜排骨、鱼香虾仁、茶香排骨等等好吃的他们的做饭写成方法,封装到一个叫美食的类中。

最后,当我们想吃这些好吃的时候就去找美食(),将美食实例化成可乐鸡翅(对象)然后去使用可乐鸡翅的做法(方法)去做就可以了。

2、面向对象 与 面向过程 的 比较

# 面向对象 是 对面向过程的补充

# 面向对象是站在 将军的角度去部署战役, 面向过程是站在 战斗排长的 位置去打山头

3、面向对象的三大特征(需要牢记)

– 封装(encapsulation)
– 继承(inheritance)
– 多态(polymorphism)

4、类与对象的关系

5、类

– 成员变量 就是事物的属性表示

– 成员方法 就是事物的行为特征

6、成员变量 与 局部变量 不同点

# 类中的位置:

成员变量->类中的方法外 局部变量->方法内或方法的声明

# 内存中的位置:

成员变量->堆(程序猿自己申请的并声明大小的内存块)局部变量->栈(系统分配)

# 生命周期:

成员变量->跟随对象局部变量->随着方法的调用

# 初始化:

成员变量->有默认的初始化值 局部变量->没有默认,必须先定义,赋值之后再使用

7、匿名对象

 — 没有名字的对象,对象的一种简化形式

 — 使用场景:1)对象调用方法时,只调用一次方法2)作为实参传递时

8、类的构造方法(构造器)

 — 作用:为对象的成员变量进行初始化

 — 格式:与类名完全相同,不需要返回值和void

 — 注意:1)如果不写构造器,系统将会给出默认的构造器,这个无参的构造器会实现 实例域里面的数值型->0、boolean->false、对象->null这样 的功能。2)可以重载

9、类的标准写法

—private成员变量

—构造器1)无参数2)带参数

—成员变量的getter()/setter()

—成员变量的赋值方法:1)带参构造器 2)无参构造器+setter()

—注意:如果单独使用getter方法输出成员变量信息比较麻烦,而已单独加一个public的方法单独输出信息。

10、类初始化过程

比如:Food f = new Food();

– 加载Food.class

– 在栈内存为f开辟空间

– 在堆内存为食物对象开辟空间

– 对食物对象的成员变量进行默认初始化

– 对食物对象的成员变量进行显示初始化

– 通过构造方法对食物对象的成员变量赋值

– 食物对象初始化完毕,把对象地址赋值给f变量

11、static关键字

—修饰成员变量和成员方法

—特点:

– 随着类的加载而加载

– 优先于对象存在

– 被类的所有对象共享

判断是否使用静态关键字的条件

– 可以通过类名直接调用

– 接口中的成员变量默认就是final static的

—注意: 1)静态方法中是没有this关键字2)静态方法只能调用静态成员变量和静态成员方法

12、静态内存示意图

static的内容在方法区的静态区

13、静态变量与成员变量的区别

# 所属不同:静态变量-> 类  成员变量-> 对象

# 内存位置:静态变量-> 方法区的静态区  成员变量-> 堆内存

# 生命周期:静态变量-> 类  成员变量-> 对象

# 调用方式:静态变量-> 类名或者对象  成员变量-> 对象

14、对“public static void main(String []args)”解释:

—public:访问权限足够大

—static:无需创建对象,直接通过类名来访问

—void:无返回值

—main:jvm识别这个名字

—args:接受键盘录入

15、代码块

—局部代码块:在方法中出现;限定变量生命周期,及早释放,提高内存利用率。

—构造代码块:在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行

—静态代码块:在类中方法外出现,加上static关键字;对类进行初始化,在类加载时候执行一次,并且只执行一次。

二、封装

1、概念: 隐藏属性和方法的实现细节,只对外提供公共的访问方式。

2、优点: 1)隐藏细节  2)复用性  3)安全性

3、原则: 1)将能隐藏的东西都封装起来2)属性隐藏、提供公共方法访问

三、继承

#概述:

- 多个类中存在相同的属性和行为的时候,我们可以将这些相同的内容抽取到一个类中,多个类继承这个类就可以——提高代码的复用性

- 被继承的类称为父类、超类或者基类,继承他们的类被称为子类或者派生类

- Java仅支持单继承模式

#继承的优点 

- 提高代码的复用性:父类的方法子类可以调用,也可以重写(覆盖)

- 可维护性:直接修改父类,或者重写

- 类与类之间产生了关系,是多态的前提

#Java继承的特点

- 单继承模式

- 顺序继承机制,所有类的最终父类是Object

- 子类只能继承父类的非私有的成员

- 子类不能继承父类的构造器,但是可以用super去访问父类的构造器

- 在子类中访问一个变量

1)子类局部

2)子类成员

3)父类棵访问的成员

- 通过一个子类对象去访问一个 方法

1)子类中

2)父类中

3)父类的父类中

#对super 和 this 的总结

- this 本类的引用  |  super 父类的引用

- 访问成员变量:this.成员变量  |  super.成员变量

- 访问构造器: this(...)  |  super(...)

- 访问成员方法:this.成员方法()  |  super.成员方法()

#继承中构造方法的关系

- 因为子类会继承父类中的数据,可以还会使用父类的数据,所以,在对子类进行成员初始化之前要对父类进行构造(数据的初始化)

- 子类中的构造器中第一条语句必须是super();(就是调用父类的构造器,可以是默认无参,也可以是重载的构造器)

#方法的重写(覆盖)

- 子类中和父类中声明一模一样的方法,重写后访问修饰符应该比父类的访问修饰符的权限大

- 使用

1)子类使用自己重写后的方法

2)子类可以用super去调用父类中的方法

- 注意:

1)父类私有方法不能被重写

2)父类中静态方法,子类也必须用静态方法进行重写(static不能用this 和 super)

#final关键字

- 修饰类 -> 类不能被继承

- 修饰变量 -> 变量变为常量,只能被赋值一次

- 修饰方法 -> 方法不能被重写         

- 修饰局部变量 -> 1)在方法内部,该变量不能被改变 2)在方法声明上(基本类型或引用类型)不能改变

- final变量,在对象构造完毕之前初始化完毕

四、多态

#概述:不同时刻表现出的不同状态

#优缺点

- 优点:维护(继承)、扩展(多态)

- 不能访问子类中特有的功能(若要访问需要提供转换工厂)

#转型

- 父到子:父类引用转为子类对象

- 子到父:父类引用指向子类对象

 

#抽象类(abstract)

- 一个没有方法体的方法要定义成抽象方法,而类中如果有抽象方法这个类被称为抽象类

- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

- 抽象类的子类要么 还是抽象类 要么重写抽象类中的所有方法

- 成员特点:

1)成员变量:变量、常量、静态变量

2)构造方法:不能实例化,可以初始化(子类访问父类数据的初始化数据)

3)成员方法:抽象方法;非抽象方法;静态方法(不能是抽象方法)

- abstract和哪些关键字冲突

1)private 冲突

2)final 冲突

3)static 无意义

补充:

(1)抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。

如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

(2)抽象类和接口的区分:

1)单继承和多继承 2)默认行为 3)继承是“is-a"关系,实现接口则是实现了interface定义的契约而已。 

五、接口

#概述:在向父类中 抽取相同内容时,有些内容不合适抽取到父类中,但是直接定义到子类中同样不划算,这时我们将他们抽象到同一个接口中。接口

可以理解为一个没有实例域的抽象类。他的设计理念是扩展功能,而抽象类是公性功能。

#接口的特点

- 接口可以多继承(继承多个接口)

- 一个类可以实现多个接口

#接口成员的特点

- 成员变量:public static final(静态共有的常量)

- 构造方法:没有

- 成员方法:只能是抽象方法(public abstract 可省略)

#类和接口的关系

- 类与类:(继承)单继承,多层继承

- 类与接口:(实现)一个类 只能继承一个类 但可以  实现多个接口 

- 接口与接口:(继承)单继承、多继承、多层继承

#形参和返回值问题

• 形式参数

– 基本类型

– 引用类型

– 抽象类和接口类型也可以作为形式参数。

• 类:需要的是该类的对象

• 抽象类:需要的是该抽象类的子类对象

• 接口:需要的是接口的子类实现

• 返回值类型

– 基本类型

– 引用类型

– 抽象类和接口类型也可以作为返回值类型

#带包的类的编译和运行

• 手动式

a:javac编译当前类文件

b:手动建立包对应的文件夹

c:把a步骤的class文件放到b步骤的最终文件夹下

d:通过java命令执行。注意了:需要带包名称的执行

java com.xxx.HelloWorld

• 自动式

a:javac编译的时候带上-d即可javac -d . HelloWorld.java

b:通过java命令执行。和手动式一样

#类及其组成可以用的修饰符

六、鸣谢:

感谢师傅(xubin)的辛勤讲解。

——不要因为走得太远而忘记为什么出发

转载地址:https://lipenglin.blog.csdn.net/article/details/50380938 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux 安装python插件 测网速
下一篇:数据结构 — 堆排序

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月15日 05时14分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章