初学者——面向对象的理解03

Posted tkzm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学者——面向对象的理解03相关的知识,希望对你有一定的参考价值。

什么叫做继承

继承是Java中实现代码重要的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类。简单点来说就是继承是类和类之间的关系。

为什么要使用继承

提升代码的复用性
减少代码的冗余

继承的创建

class 子类 extends 父类

extends关键字实现类的继承

super关键字

(1)使用super关键字,super代表父类对象
(2)在子类构造方法中调用且必须是第一句
(3)不可以访问父类中定义为private的属性和方法

继承条件下构造方法的调用规则

  1. 子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法系统默认调用父类的无参构造方法
  2. 子类构造方法通过super显式调用父类的有参构造方法,执行父类相应构造方法,而不执行父类无参构造方法
  3. 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
private String varieties;//品种
  public Dog(String name, int health, int love,String varieties) {
        super(name, health, love);//显示调用父类构造 放在第一位
        this.varieties=varieties;
    }

 

子类与父类的关系

子类可以继承父类的任何非私有成员(变量  方法 构造) 

子类永远比父类拥有更多的成员 子>父

 

方法重写规则

  • 参数列表相同
  • 方法名相同
  • 返回值类型相同或者是其子类
  • 访问权限不能严于父类
  • 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
  • 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
  • 父类的私有方法不能被子类覆盖
  • 不能抛出比父类方法更多的异常

 方法重写vs方法重载

技术图片

方法重写原则

除了方法体不同以外,其余所有(返回类型,返回值,参数)完全一致

 abstract抽象类

有抽象方法的类一定是抽象类

抽象类不一定有抽象方法

抽象类不能被实例化   例如 Pen pen=new Pen();不能实例化

抽象类的子类可以是普通类,该普通类要实现抽象类中的抽象方法

抽象类的子类也可以是抽象类,此时,父类中的抽象方法可以在子类中不被实现

封装中get和set使用

get:获取字段的值 函数返回值类型===>字段的类型

set:给字段设置值 函数的参数===>字段的类型

//获取数据
public String getName() {
        return name;
    }
        //添加数据
    public void setName(String name) {
        this.name = name;
    }

 

Object类被子类经常重写的方法

技术图片

构造函数

一个类在没有编写构造函数的情况下默认存在一个无参构造 如果用户编写了 默认存在的就消失了

构造函数是没有返回值类型的

构造函数的执行时机:是在类的实例化的过程中,会自动调用构造函数

作用:完成类的成员变量的初始化

public Person() {
    }//这就是系统默认的构造函数即使不创建也会存在

 

 什么是多态

同一个引用类型,使用不同的实例而执行不同操作

发生在具有继承关系的实体中,不同实体为了完成同一操作(函数名)所采取的不同方式(方法体)。

里氏替换原则(Liskov Substitution Principle)

   在出现超类的位置上,可以使用其子类对象 解释一下:
(由于,子类比父类更优秀,出现父类的任何位置,子类都可以使用)

现实多态的三种方式

  1. 父类类型接收子类对象实现的多态
  2. 父类类型作为方法形参
  3. 父类类型作为方法返回值

向上向下转型

   向上转型:子类对象--->父类做的转换 无需强转(没有异常)

Pet pet=new Dog("小白", 50, 89, "阿拉斯加");
        pet.showInFo();//向上转型自动转换

 


   向下转型:父类类型--->子类类型转换 需要强转,使用instanceof比较两个类型避免发生(ClassCastException)异常

Pet pen=new Penguin("小红", 50, 90, "Q妹");
        if(pen instanceof Penguin){//用 instanceof比较避免出现异常
        Penguin peng=(Penguin)pen;//需要强制转换
        peng.eat();
        }else {
            System.out.println("您输入的不准确");
        }

 

值类型和引用类型

值类型:八种基本数据类型

引用数据类型:Object

值传递

将栈上的数据Copy一份

引用类型的值传递会改变

值类型的值传递不会改变

Java中只支持值传递

 

以上是关于初学者——面向对象的理解03的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象(封装继承多态)+ 面向对象小栗子

关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

python运维开发----面向对象(上)

Python 面向对象(初级篇)