day07 7.1 Java中的面向对象之类与对象
day07 7.1 Java中的面向对象之类与对象
【一】类与对象
【1】类定义规范
- 类与对象的关系
- 类 是实体对象的概念模型,笼统的,不具体的,
- 比如人类、动物类、鸟类
- 对象 又称为实体,类具体化的表现
- 小红/小明
- 小猫一号/小狗一号
- 对象中有属性,有方法
- 不同对象属性是独有的
- 方法是共有的
- 类 是实体对象的概念模型,笼统的,不具体的,
- 类定义规范
public:表示类是公有的
java文件的文件名必须是public class 类名
abstract:抽象类
final:类如果被 final 修饰 ,这个类不能被别的类所继承
extends:继承某个父类
implements:实现的接口
(1)类的定义
(2)对象的实例化
【2】Java的类属性
- 在类中有属性
- 成员属性
- 只要不被static修饰的,就是成员属性,他是属于对象的,需要对象来调用
- 静态变量
- 只要 static修饰的,需要类或类实例的对象来调用
- 成员属性
- 在Python中年对象的属性只能对象来调用
- 在Python中年类的属性只能类来调用
【3】成员方法
- 类中没有被static修饰的方法,绑定给类的,需要类来调用。
Python中有绑定给对象的方法,绑定给类的方法
Python的类中,不加任何装饰器的的方法是绑定给对象的
Python的类中,使用@classmethod修饰的,是绑定给类的方法
【4】构造方法
在Python中
__init__
方法完成对象的初始化在Java中
完成对对象的初始化,向对象中添加内容
可以存在多个,使用哪种初始化方式,就会触发那种构造方法
【5】this关键字
- this是写在类中的成员(对象)方法中
- [static修饰的方法中,即静态方法中,没有this]
【6】访问控制符
访问范围 | private | friendly(默认) | protected | public |
---|---|---|---|---|
同一个类 | 可访问 | 可访问 | 可访问 | 可访问 |
同一包中的其他类 | 不可访问 | 可访问 | 可访问 | 可访问 |
不同包中的子类 | 不可访问 | 不可访问 | 可访问 | 可访问 |
不同包中的非子类 | 不可访问 | 不可访问 | 不可访问 | 可访问 |
【7】静态变量和静态方法(static)
在类中,使用static修饰的变量是属于类的,正常类来调用,但是对象也可以调用
在类中,使用static修饰的方法是属于类的,正常类来调用,不需要实例化,就能调用,但是对象也可以调用,但是他的内部没有this关键字
什么情况下定义对象的方法[成员方法]
什么情况下定义类的方法[静态方法]
以后,不想初始化得到对象就能使用这个方法,就定义成静态方法。
(1)什么是静态变量(类变量)
- 在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量
- 常量称为静态常量
- 方法称为静态方法或类方法
- 它们统称为静态成员,归整个类所有。
- 静态成员不依赖于类的特定实例,被类的所有实例共享
- 就是说 static 修饰的方法或者变量不需要依赖于对象来进行访问
- 只要这个类被加载,Java 虚拟机就可以根据类名找到它们
(2)什么是静态变量
- 类的成员变量可以分为以下两种:
- 静态变量(或称为类变量),指被 static 修饰的成员变量
- 实例变量,指没有被 static 修饰的成员变量
静态变量与实例变量的区别如下:
1)静态变量
运行时,Java 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配
在类的内部,可以在任何方法内直接访问静态变量
在其他类中,可以通过类名访问该类中的静态变量
2)实例变量
每创建一个实例,Java 虚拟机就会为实例变量分配一次内存
在类的内部,可以在非静态方法中直接访问实例变量
在本类的静态方法或其他类中则需要通过类的实例对象进行访问
(3)什么是静态方法
- 类的成员方法也可以分为以下两种:
- 静态方法(或称为类方法),指被 static 修饰的成员方法
- 实例方法,指没有被 static 修饰的成员方法
- 静态方法与实例方法的区别如下:
- 静态方法不需要通过它所属的类的任何实例就可以被调用
- 因此在静态方法中不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法
- 但是可以直接访问所属类的静态变量和静态方法。
- 另外和 this 关键字一样, super 关键字也与类的特定实例相关
- 所以在静态方法中也不能使用 super 关键字
- 在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法
【二】面向对象之继承
【1】继承格式
-
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
-
Java中的继承
- 只支持单继承,不支持多继承,但支持实现多个接口
- 支持一条线上的多重继承
-
Java不支持多继承,但是可以通过接口来实现多继承的功能
【2】构造方法
(1)分文件继承
- 构造Animal类
- 构造Dog类
- 实例化调用
(2)单文件继承
在一个文件中只能有一个 public 方法
(3)小结
- 子类如果没写构造方法
- 默认使用父类无参构造
- 本案例名字为:固定名字
【3】super 与 this 关键字
有了继承关系就会多了另一个关键字(原来有this):super(等同于python中的super())
- super关键字:
- 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
- this关键字:指向自己的引用
【三】重写(Override)与重载(Overload)
【1】什么是重写
- 重写(Override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
- 即外壳不变,核心重写
【2】什么是重载
-
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。
-
返回类型可以相同也可以不同
-
被重载的方法必须改变参数列表(参数个数或类型不一样)
【3】演示
【四】面向对象之接口
【1】接口的介绍
(1)接口是一个抽象类型
- 接口(Interface),是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
- 一个类通过继承接口的方式,从而来继承接口的抽象方法。
只在接口中定义某个方法,可以不写这个方法,意思是继承接口的类必须要有我定义的接口中的方法
(2)接口并不是类
- 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。
- 类描述对象的属性和方法。接口则包含类要实现的方法。
(3)接口无法被实例化,但是可以被实现
- 一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
- 接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口不支持被 new
(4)接口与类相似点
- 一个接口可以有多个方法
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名
(5)接口与类的区别
- 接口不能用于实例化对象
- 接口没有构造方法
- 接口中所有的方法必须是抽象方法
- 接口不能包含成员变量,除了 static 和 final 变量
- 接口不是被类继承了,而是要被类实现
- 接口支持多继承
- 类可以实现多个接口
【2】接口声明
- 定义接口语法
- 官方一点的写法
- 示例
- 接口
- 子类中实现接口
- python中的鸭子类型
- 只要我的方法中有这两个方法,就是同一类
- Java中的鸭子类型
- 在Java中必须实现继承的同一个接口的两个类才叫鸭子类型,是同一类
【3】接口继承
- 可以继承多个接口
【4】接口实现
- 可以实现多个接口
【五】面向对象之抽象类
- 定义格式
- 案例演示
【六】抽象类和接口的区别
【小结】
-
关键字不一样
-
类继承是
implements
extends
-
类是类,接口是接口
-
抽象类中方法可以具体实现,但是接口不能有具体实现
-
一个类可以实现多个接口,但是不能继承多个类
【详解】
-
关键字不同:
-
在Java中,使用
abstract
关键字定义抽象类 -
使用
interface
关键字定义接口。
-
-
形式上的区别:
-
类可以继承一个类,但类不能继承多个类
-
一个类可以实现多个接口。
-
-
方法的实现:
-
抽象类可以包含具体的方法实现
- 这些方法可以被子类继承和重写,也可以直接被调用。
-
接口只能定义方法的签名
- 不能包含方法的实现,实现接口的类必须提供接口中定义的所有方法的具体实现。
-
-
字段的定义:
-
抽象类可以定义实例变量
- 这些变量可以是任意的访问修饰符,并且可以有默认值。
-
接口只能定义常量字段(
static final
)- 而且字段默认为公共、静态和最终。
-
-
设计思想:
-
抽象类用于表示一种通用的父类
- 其中包含了子类所共有的属性和方法。
-
接口则用于定义一组行为和功能的规范
- 不关心具体实现细节,只关注方法的输入和输出。
-
- 总结来说
- 抽象类更类似于普通类的扩展和继承
- 接口更像是一种规范或者契约,用于描述类应该具有的行为和功能。
- 在设计中,应根据具体的需求选择使用抽象类还是接口。
- 如果需要表达一种"is-a"的关系并且需要共享代码实现
- 可以使用抽象类;
- 如果需要表达一种"has-a"的关系或者需要多继承
- 可以使用接口。
【七】面向对象之封装
【1】面向对象三大特性
-
继承
-
多态
-
封装
-
封装
- 把属性或方法放在类的内部,可以隐藏起来,然后拿到一个对象
- 可以 .属性 .方法 进行使用
【2】在Java中,习惯把属性定义成私有的,然后提供方法,来进行读写
- 解决
- 支持自定义返回数据
【3】详解
【八】面向对象之多态
【1】什么是多态
- 多态是同一类事物[实例,对象]多种形态
- 从而调用同一类[实例,对象]方法时,表现出不同
【2】多态存在的三个必要条件
- (1)编写具有继承关系的父类和子类/接口实现
- (2)子类重写父类方法
- (3)使用父类的引用指向子类的对象
【3】继承实现的多态
- 子类转父类不叫强转,直接赋值给父类即可
- 父类转子类需要强转,强转可能会出错
【4】其他知识详解
(1)多态成员变量编译运行看左边
(2)多态成员方法:编译看左边,运行看右边
(3)子类增加独有方法walk()
(4)引用类型转换
- 1 向上转型:【儿子变父亲】
- 多态本身是子类向父类向上转换(自动转换)的过程
- 这个过程是默许的
- 当父类引用指向一个子类对象时,就是向上转型
- 2 向下转型:【父亲变儿子,需要强制转换】
- 向下转型,强制类型转换
- 3 类型转换会出现【类型转换异常】
- 4 instanceof 判断具体类型
(5)抽象类实现的多态
(6)接口实现的多态
【九】枚举
- Java 枚举是一个特殊的类,一般表示一组常量,
- 一年的 4 个季节
- 一年的 12 个月份
- 性别有男,女,未知
【十】包(package)
【1】什么是包
- 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
我们可以定义很多包
不同包下,类名可以重复
同一个包下,类名不能重复
【2】包的作用
-
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
-
2、同文件夹一样,包采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
-
3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
【3】创建包
- Helper.java
【4】引入包,并使用包中的类
__EOF__

本文链接:https://www.cnblogs.com/dream-ze/p/17557889.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17557889.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析