java、day11封装 继承 多态 super object 父子关系强制转换

面向对象三大特性详解

1.封装

1.1该露的露

  • 高内聚,低耦合。简单意思就是类的内部数据细节操作由自己完成,不允许外部干涉;低耦合:仅仅暴露少量的方法给外部使用

1.2封装(数据的隐藏)

  • 通常,应该禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏

1.3属性私有 get/set

  • 属性私有把public改成private

1.3.1快速设置get/set 只要alt+insert就可以

 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调用子类的时候

在狂神说java基础第69

  • 会先调用父类的无参构造再调用子类的无参构造(因为有一句隐藏的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父子关系强制转换

  • 父类引用指向子类的对象

  • 把子类转换为父类,向上转型可以直接转换过去

  • 父类向子类转换,向下转型;强制转换

  • 方便我们的方法调用,减少重复的代码!使其变得更加简洁

总结

  • 在基础类型中

    • 精度自动往高处转

    • 低转高强制转换为低类型精度会缺失

  • 在引用类型中(关于精度缺失这一点和基础类型不太一样)

    • 子类往父类转也是自动

    • 但是自动转会缺失方法

    • 父类转子类需要强制转换

posted @ 2022-03-24 17:51  newlive122  阅读(295)  评论(0)    收藏  举报