本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!