0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全面讲解⾯向对象编程三⼤特性 1

jf_78858299 来源:小牛呼噜噜 作者:小牛呼噜噜 2023-02-09 14:24 次阅读

封装

把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。

通俗地说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。

通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误地使用了对象的私有部分。但是如果⼀个类没有提供给外界访问的⽅法,那么这个类也没有什么意义了。

我们来看一个常见的 类,比如:Student

public class Student implements Serializable {
    
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

将对象中的成员变量进行私有化,外部程序是无法访问的。对外提供了访问的方式,就是set和get方法。

而对于这样一个实体对象,外部程序只有赋值和获取值的权限,是无法对内部进行修改

继承

继承 就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类 {
}
 
class 子类 extends 父类 {
}

继承概念的实现方式有二类:实现继承接口继承

实现继承是指直接使用基类的属性和方法而无需额外编码的能力

接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力

一般我们继承基本类和抽象类用 extends 关键字,实现接口类的继承用 implements 关键字。

注意点:

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

子类可以拥有父类的属性和方法。

子类可以拥有自己的属性和方法, 即⼦类可以对⽗类进⾏扩展。

子类可以重写覆盖父类的方法。

JAVA 只支持单继承 ,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。

使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

# implements 关键字

public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void show();
}
 
public class C implements A,B {
}

值得留意的是:关于父类私有属性和私有方法的继承 的讨论

这个网上 有大量的争论,我这边以Java官方文档为准:

With the use of the extends keyword, the subclasses will be able to inherit all the properties of the superclass except for the private properties of the superclass.

子类不能继承父类的 私有属性事实),但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。

官方文档 明确说明:privatefinal不被继承,但从内存的角度看的话:父类private属性是会存在于子类对象中的。

通过继承的方法(比如,public方法)可以访问到父类的private属性

如果子类中存在与父类private方法签名相同的方法,其实相当于覆盖

个人觉得文章里的一句话很赞,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。

多态

同一个行为具有多个不同表现形式或形态的能力就是 多态 。网上的争论很多,笔者个人认同网上的这个观点:重载也是多态的一种表现,不过多态主要指运行时多态

Java 多态可以分为 重载式多态重写式多态

-重载式多态,也叫编译时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。也就是说这种多态再编译时已经确定好了。

-重写式多态,也叫运行时多态。运行时多态是动态的,主要指继承父类和实现接口时,可使用父类引用指向子类对象实现。 这个就是大家通常所说的多态性

这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。这种多态可通过函数的重写以及向上转型来实现。

多态存在的三个必要条件:

继承

重写

父类引用指向子类对象:Parent p = new Child();

我们一起来看个例子,仔细品读代码,就明白了:

@SpringBootTest
class Demo2021ApplicationTests {

    class Animal {
        public void eat(){
            System.out.println("动物吃饭!");
        }
        public void work(){
            System.out.println("动物可以帮助人类干活!");
        }
    }

    class Cat extends Animal {
        public void eat() {
            System.out.println("吃鱼");
        }
        public void sleep() {
            System.out.println("猫会睡懒觉");
        }
    }

    class Dog extends Animal {
        public void eat() {
            System.out.println("吃骨头");
        }
    }

    @Test
    void contextLoads() {
        //part1
        Cat cat_ = new Cat();
        cat_.eat();
        cat_.sleep();
        cat_.work();

        //part2
        Animal cat=new Cat();
        cat.eat();
        cat.work();
        cat.sleep();//此处编译会报错。

        Animal dog=new Dog();
        dog.eat();//结果为:吃骨头。此处调用子类的同名方法。
        
  //part3
        //如果想要调用父类中没有的方法,则要向下转型,这个非常像"强转"
        Cat cat222 = (Cat)cat;        // 向下转型(注意,如果是(Cat)dog 则会报错)
        cat222.sleep();        //结果为:猫会睡懒觉。 可以调用 Cat 的 sleep()
    }



}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6998

    浏览量

    88936
  • 封装
    +关注

    关注

    126

    文章

    7867

    浏览量

    142879
  • 代码
    +关注

    关注

    30

    文章

    4776

    浏览量

    68508
收藏 人收藏

    评论

    相关推荐

    嵌入式C语言面向对象编程---多态

    前两篇文章主要讲述了 C 语言面向对象编程– 封装和继承。本篇文章继续来讨论一下,如何使用 C 语言实现面向对象编程的另一个重要特性:多态。
    发表于 10-31 14:41 997次阅读

    Python的面向对象编程详解

    一般编程可分为面向过程编程,和面向对象编程。Python的面向对象编程,与Java的面向
    发表于 09-04 16:35 557次阅读
    Python的面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>详解

    每日一教labview视频教程【12.15】labview面向对象编程(上)

    面向对象编程视频:专家从类开始进行讲解,详细说明了如何进行面向对象编程。http://yunpan.cn/lk/480ep
    发表于 12-15 10:35

    【原创视频】小草手把手LABVIEW之OOP面向对象编程基础(1

    =a2hzp.8244740.0.0-------------------------------------视频内容:LabVIEW面向对象编程OOP介绍(分多个小节,本视频只是最初一个小节,只是介绍)时长:14分钟
    发表于 05-23 01:02

    编程魔法师大思想视频宣传片

    讲解了单片机裸编程项目的设计实现过程,并通过一只电机对象到两只电机对象的设计演变过程,深入讲解了数码分离、线程实现、
    发表于 04-23 21:46

    LabVIEW面向对象的ActorFramework(1

    、维护、迭代。如果想要更好的学习这个概念,推荐两本讲解的面向对象编程很经典的图书:1.《面向对象的思考过程》2.《面向
    发表于 02-10 14:09

    面向对象编程及其特性 精选资料分享

    编程语言分为面向过程编程、函数式编程和面向对象编程。其实python就是一种面向对象
    发表于 07-21 08:38

    面向对象编程介绍

    目录一、面向对象编程介绍1.面向过程编程2.函数式编程3.面向对象
    发表于 12-13 07:22

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    对象特性的测定

    对象特性的测定 一、 实验目的1、通过实验了解对象的静态和动态特性;2、掌握对象静态和动态
    发表于 05-17 10:53 14次下载

    面向对象编程练习

    实验 3 面向对象编程练习 一、实验目的     通过编程和上机实验理解 Java 语言是如何体现面向对象编程
    发表于 09-23 18:57 3042次阅读

    LabVIEW 网络讲坛第四季:面向对象编程的应用

    本视频主要讲解了基本概念,以及面向对象编程在LabVIEW中的应用。
    的头像 发表于 06-25 02:46 2885次阅读
    LabVIEW 网络讲坛第四季:面向<b class='flag-5'>对象</b>的<b class='flag-5'>编程</b>的应用

    Labview面向对象编程快速入门教程

    在面向对象编程中, 类用来表示通用特性。 例如,假设有一个描述汽车的类。 类中定义了各种汽车的通用特性对象是类的特定实例。汽车类的一个
    发表于 07-31 08:00 82次下载
    Labview面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>快速入门教程

    全面讲解对象编程特性 2

    这块就比较特殊了,我们一句句来看 `Animal cat=new Cat();` 像这种这个 `父类引用指向子类对象`,这种现象叫做:**"向上转型"**,也被称为**多态
    的头像 发表于 02-09 14:25 294次阅读
    <b class='flag-5'>全面</b><b class='flag-5'>讲解</b>⾯<b class='flag-5'>向</b><b class='flag-5'>对象</b><b class='flag-5'>编程</b><b class='flag-5'>三</b>⼤<b class='flag-5'>特性</b> 2

    西门子PLC面向对象编程

    面向对象编程是计算机高级语言的一种高级编程模式,这种设计思想也可以应用于工业控制系统的plc程序中。虽然我们 无法实现面向对象编程的许多优
    发表于 04-17 11:41 7次下载
    西门子PLC面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>