目录
一、封装
面向对象编程的三个核心知识
- 封装
- 继承
- 多态
1.1 什么是封装?
生活中的封装有: 快递封装,将物品封装空间里面
那代码的封装是什么呢?
-
方法算是封装
-
类的封装
- 主要指的对属性封装
1.2 为什么封装?
那为什么要封装呢?它的作用是什么呢?
-
快递为例: 封装可以方便传输
-
类的封装:
- 可以封装在方法内,可以再方法内实现复杂的逻辑
- 总结: 隐藏实现的细节,对外提供一些访问的方式
1.3 如何封装?
两大步骤
- 属性私有 --> private修饰属性
- 提供setXxx,getXxx方法
特殊的,set get方法是固定写法,一定是setXxx getXxx,Xxx是属性名
- IDEA 快捷键 alt + insert 快速生成
想了解IDEA 快捷键的可以点这里 新手快速上手IDEA【常用快捷键】
封装手机类
public class Phone {
private String brand;// 品牌
/**
* private 私有的
* 一旦被private修饰的属性,方法只能在本类中调用
*/
private double price;// 价钱
public void setBrand(String brand){
this.brand = brand;
}
public String getBrand() {
return brand;
}
// 设计方法,给价钱赋值
public void setPrice(double price){
if (price > 0) {
this.price = price;
} else {
System.out.println("设置价钱有误!" );
this.price = 999999999;
}
}
// 设计方法,能获取属性值
public double getPrice() {
return price;
}
public void play() {
System.out.println(price+"元,手机玩游戏");
}
}
二、继承
2.1 什么是继承
-
生活中: 孩子继承父辈的财产(物品),继承后孩子就可以使用
-
代码中: 子类 继承 父类,子类就可以使用父类的属性和方法
关键字
extends
2.2 为什么要继承
- 代码减少重复,提供代码复用性
- 是多态的前提
2.3 如何写继承
- 在类声明上,使用extends声明要继承的类,如下
public class A extends B{
}
以上,就是继承,读作: A类继承B类,其中A类是子类,B类是父类
特殊的:
- java的继承是单继承, 即一个类只能继承一个父类
- 支持层次继承,A类继承B类,B类继承C类,A对象可以调用C对象中的属性和方法
父类Animal
public class Animal {
int age;
String name;
void eat() {
System.out.println("吃东西");
}
}
子类Dog
/* Dog类是子类
* Animal是父类
*/
public class Dog extends Animal{
}
测试
public class TestExtends {
public static void main(String[] args) {
Dog dog = new Dog( );// Dog是继承Animal
int age = dog.age;// 调用父类的属性
System.out.println("age = " + age);
dog.eat();// 调用父类的方法
}
}
2.4 继承中属性问题
子类可以使用父类的非私有属性,无法使用父类私有的属性
子类中可以定义自己特有的属性,自己对象可以调用
但是,父类对象无法向下使用子类中的属性
2.5 继承中方法问题
子类对象可以调用父类中非私有的方法,私有方法无法调用
子类中可以定义自己特有的方法,自己调用
父类对象是无法向下调用子类中的方法
子类中有与父类一样的方法 —> 重写!!
2.6 继承中构造方法问题
继承中,创建子类时,
- 会先创建父类对象,将父类属性初始化
- 后再创建子类对象
这也解释了,子类对象为什么可以使用父类属性,因为父类对象创建了,属性初始化了,子类才可以直接使用
那么,子类创建对象时,是如何调用父类构造,创建父类对象的呢??
- 因为在构造方法的第一行有默认隐藏的super()在调用父类构造,创建父类对象
ps: 关于super的问题,详情请看第四章笔记…
2.7 总结
- 子类继承父类,使用extends
- 继承后,子类能使用父类非私有的属性和方法
- 子类和父类方法有重复—> 重写
- 继承后,父类不能子类任何东西
- 继承时,先创建父类对象,再创建子类对象
- super
三、重写
什么是重写?
-
重写是在继承的时候,子类重写父类的方法.
-
就是父类有一个方法,子类又重新定义一个一模一样的方法,叫做重写,又叫覆写(Override)
重写的要求:
- 子父类重写的方法 访问修饰符一样
- 特殊的: 子类访问修饰符 >= 父类的
- 子父类重写的方法 返回值类型一样
- 子父类重写的方法 方法名一样
- 子父类重写的方法 参数列表一样
- 子父类重写的方法 方法体不一样!!!
为什么子类要重写父类方法???
- 这些父类中的方法确实是需要的,且是共性的
- 但是父类执行的效果不理想,不适合子类 . 需要每个子类重写以满足自身的需求(情况)
- 总结: 父类方法不适合子类,所以子类需要重写!
四、this和super
前面说: 创建子类对象时,会先创建父类对象,再创建子类对象
为什么?
- 是因为java语法设计,在构造方法第一行默认隐藏有个super() 调用父类的无参构造
super是什么?
- super是代表父类对象
super能干什么?
- 作用1: super(),调用父类无参构造 ; super(参数)调用父类有参数的构造方法
- 作用2: super代表父类对象,调用父类的属性和方法
- super.属性
- super.方法()
this和super
this | super | |
---|---|---|
含义 | 代表当前类对象 | 代表父类对象 |
属性 | this.属性; (调用当前类属性, 如果自己没有也可以调用父类的属性) | supe.属性;只能调用父类属性 |
方法 | this.方法(); (调用当前类方法, 如果自己没有方法也可以调用父类的方法) | super.方法();只能调用父类方法 |
构造方法 | this(); 调用自己的无参构造 this(参数); 调用的是自己的有参构造 | super();调用父类无参构造 super(参数);调用父类有参构造 |
五、有父类时对象创建的过程
有父类时对象创建的过程,
- 先创建父类对象
- 在创建子类对象
- 在每个类创建对象时都先属性初始化再执行构造
六、访问修饰符
-
访问修饰符,又叫访问限制符,控制符
-
访问就是调用
-
修饰符/限制符/控制符 , 即控制能否调用
访问修饰符,主要是用来修饰
- 方法
- 属性
哪些修饰符
- public
- protected
- 缺省/默认
- private
当前类 | 同包下其他类中 | 不同包的子类 | 不同包非子类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | 父类不能调用,子类可以调用 | × |
缺省 | √ | √ | × | × |
private | √ | × | × | × |
访问权限范围从大到小:public > protected > 缺省 > private
一般情况下,实战中最常见是public和private
最后
如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍