java、day11封装 继承 多态 super object 父子关系强制转换
1.封装
1.1该露的露
-
高内聚,低耦合。简单意思就是类的内部数据细节操作由自己完成,不允许外部干涉;低耦合:仅仅暴露少量的方法给外部使用
1.2封装(数据的隐藏)
-
通常,应该禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
1.3属性私有 get/set
-
属性私有把public改成private
import oop.Demo03.Person;
public class Application {
public static void main(String[] args) {
Person s1 = new Person();
s1.setName("RAOXIN");
System.out.println(s1.getName());
s1.setSex('女');
System.out.println(s1.getSex());
}
}
//类
public class Person {
// 属性:加了private,属性私有。需要提供一些接口来操作在Application里面new创建对象以后就不能
// 对Person.name等进行操作。只有public才可以
// 名字
// 学号
// 性别
private String name;
private int id;
private char sex;
// 所以必须提供一些可以操作这些属性的方法get/set
// 提供一些public的get/set方法
// get获得这个数据
public String getName(){
return name;
}
// set设置数据
// alt+insert可以直接设置set get
public void setName(String name){
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
if(sex!='男'&&sex!='女'){
System.out.println("你是什么东西");
}else{
this.sex = sex;
}
}
// 方法
// 学习()
// 睡觉()
public void study(){
System.out.println("我在学习");
}
public void sleep(){
System.out.println("我在睡觉");
}
}
1.4封装的优点
-
提高程序的安全性
-
提高系统的可维护性
-
统一接口
-
隐藏代码的细节
2.继承
继承的本质是对某一批类的抽象,从而对现实世界更好的建模extends的意思就是扩展。子类是父类的扩展
2.1继承的特性(ctrl+h打开继承树)
-
继承是类与类之间的一种关系。除此之外,还有依赖,组合,聚合等
-
继承关系的两个类,一个是父类(基类) 一个是子类(派生类)。
-
子类和父类之间,从某种意义上来讲应该具有“is a”
-
java只有单继承,没有多继承,意思就是,一个父亲可以有多个儿子,但是一个儿子只能有一个父亲
2.1.1可以继承父类的方法与属性但是不能继承父类private类型的属性
-
弹幕说private可以继承但是不能先是,因为其封装性
2.2打开继承树发现还有object
-
就是student继承person继承object
-
比如说我写了一个person类,但是我什么方法都没写。然后我new创建一个person对象叫小明 发现小明点(对象+点)还是会出现会让你多方法,这些方法就是object里面的。
-
java中所有类都默认继承object类
-
写出object,然后ctrl+鼠标左键就可以进入
2.3super
-
this调用本类的方法
-
super调用父类的方法
2.3.1调用子类的时候
-
会先调用父类的无参构造再调用子类的无参构造(因为有一句隐藏的super())
-
调用了父类(调用一个类会先进行它的无参构造,之前讲过)所以再这个子类的第一句其实是有一个super()指向父类的构造器,写出来也可以
-
假设当我父类写了有参构造时
-
因为写了有参构造,无参构造如果删去(所以写有参构造时,必须先写空的无参构造,也可以将子类的第一句默认调用无参构造器改为super(参数)来调用有参构造)
-
子类如果写了无参构造,就会默认调用super()来指向父类的无参构造
-
但是父类已经默认没有无参构造了,就会出错
-
2.4super注意点
-
super是调用父类的构造方法,必须在构造的第一个
-
super必须只能出现在子类的方法或者构造中
-
super和this不能同时调用构造方法
vs this
-
代表的对象不同:
-
this:本身调用着这个对象
-
super:代表父类对象的应用
-
-
前提
-
this:没有继承也可以使用
-
super:只能在继承条件下使用
-
-
构造的方法
-
this():本类的构造
-
super():父类的构造(会在子类的无参构造中第一句默认出现,调用父类无参构造,也可以自己直接写super(参数)来调用有参构造来解决)
-
3.多态
动态编译,通过多态使程序的可扩展性变强
3.1方法的重写(和重载不同)
重写都是方法的重写,和属性无关
父类的引用指向子类
方法的调用只和左边定义的数据类型有关
2.5.1alt+insert(override)重写非静态
3.2多态注意事项
-
多态注意事项
-
多态是方法的多态,属性没有多态
-
父类和子类有联系 类型转换异常 classcastexception
-
多态存在条件 :
-
需要有父子关系
-
需要重写(先执行谁看的是对象左边的类型 Person xiaohong 就是person Student xiaohong 就是Person)
-
-
-
方法不能重写的情况
-
static 属于类,不属于实例
-
final属于常量。无法改变
-
private私有
-
3.3重写个人理解
-
重写的时候,用alt+insert输入时,子类第一句会出现super().父类 就是说会先调用子类的该方法,再去调用父类的该方法。这个super和前面构造器的super不同,这个super删了就是真的没有了,但是之前构造器的super删除是默认在第一句的,所以这里子类方法重写后,调用的都是子类的方法
father s1 = son();只要子类重写了方法,就会调用子类的方法。如果没有重写,因为子类继承了父类的方法,就是调用父类的。但是因为本身就是父类,不能调用子类的方法。只能将子类重写了(比如父类有void say(),子类也有void say())替换,那就默认是重写之后的内容
3.4多态的他人理解(比较好的例子)
-
Java的方法重写(父类与子类之间的多态):子类可继承父类中的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。重写的参数列表和返回类型均不可修改。我们再举个例子,就是子承父业,但是儿子有自己想法,对父亲得产业进行再投资的过程。
4.判断是否有关instanceof父子之间强制转换
4.1 instanceof
x instanceof y
-
加入在同一条线内,就是true
-
不在同一条线内,但是有相同起点,就是false(比如第一个String)就是起点Object
-
如何不在同一条线内并且没有交点,那就会报错
4.2父子关系强制转换
-
父类引用指向子类的对象
-
把子类转换为父类,向上转型可以直接转换过去
-
父类向子类转换,向下转型;强制转换
-
方便我们的方法调用,减少重复的代码!使其变得更加简洁
总结
-
在基础类型中
-
精度自动往高处转
-
低转高强制转换为低类型精度会缺失
-
-
在引用类型中(关于精度缺失这一点和基础类型不太一样)
-
子类往父类转也是自动
-
但是自动转会缺失方法
-
父类转子类需要强制转换
-

浙公网安备 33010602011771号