Java中面向对象三大特征(封装、继承、多态)

目录

一、封装

1.1 封装的意义

1.2 如何进行封装

二、继承

2.1 继承的意义

2.2 如何继承

2.3 继承的优点

2.4 继承的缺点

三、多态

3.1 多态的定义

3.2 多态的使用要求


一、封装

所谓封装就是将对象的属性隐藏起来,不让外界直接访问,而是通过指定的方法来访问对象的属性,就叫封装。Java 中封装是面向对象三大特征之一,它的作用就是让程序的安全性得以提高。

1.1 封装的意义

我们通过下面的示例来说明这个问题。

我们创建一个 Human 类,在这个类中定义两个属性,一个姓名,一个年龄。

class Human {
    String name;
    private int age;

    public void setAge(int newAge) {
        age = newAge;
    }
    public int getAge() {
        return age;
    }
}
public class HumanTest {
    public static void main(String[] args) {
        Human human = new Human();
        human.name = "张三";
        //human.age = -18;
        human.setAge(18);

        System.out.println(human.name + " " + human.getAge());
    }
}

通过上面的示例演示,如果我们不把 age 属性隐藏起来,那么在外部(HumanTest类中的 main 方法中)就可以直接对这个属性进行赋值。这就会产生不确定的因素,如给年龄一个负数或都一个很大的数。这些情况都是不对的。为了避免这种情况的发生,我们需要把这个属性进行隐藏,从而提高程序的健康性。

1.2 如何进行封装

在 Java 中需要使用 private 关键字来修饰要被隐藏的属性。然后提供这个属性对应的两个公共方法:一个用于对这个属性进行赋值,另一个用于对这个属性进行获取值。

class Human {
    String name;
    private int age;

    public void setAge(int newAge) {
        age = newAge;
    }
    public int getAge() {
        return age;
    }
}

例如上面代码中的 setAge(int newAge) 和 getAge() 这两个方法都是封装方法。一般来说,给属性赋值的方法取名为 setXXX,而获取属性值的方法取名为 getXXX。其中XXX 表示属性的名称,该名称的首字母大写。

注意:为了安全性,在写实体类中,只要有属性存在都需要进行封装。

二、继承

继承是面向对象程序设计的第二个特征,为了提高代码的复用率,继承应运而生。

2.1 继承的意义

我们通过如下的案例来说明这个问题。

class Woman {
    public String name;
    public int age;
    public void show() {
        System.out.println(name + " " + age);
    }
}

class Man {
    public String name;
    public int age;
    public void show() {
        System.out.println(name + " " + age);
    }
}

public class PersonDemo {
    public static void main(String[] args) {
        Man man = new Man();
        man.name="张三";
        man.age=18;
        man.show();

        Woman woman = new Woman();
        woman.name = "李四";
        woman.age=19;
        woman.show();
    }
}

从上面的代码中可以发现,现个类中除了类名不同以外,其余的代码都是相同的。这样的话代码复用率就不高。为了让代码的复用率更高。我们可以把两个 类中相同的代码提取出来形成一个单独的类,然后让这两个类去继承它即可。

2.2 如何继承

首先我们需要定义一个父类,在这个父类中定义公共的属性或方法。例如上面的示例中我们可以定义一个父类如:Person,然后在这个父类中定义公共的属性和方法。

class Person {
    public String name;
    public int age;
    public void show() {
        System.out.println(name + " " + age);
    }
}

class Woman extends Person {

}

class Man extends Person {
    
}

public class PersonDemo {
    public static void main(String[] args) {
        Man man = new Man();
        man.name="张三";
        man.age=18;
        man.show();

        Woman woman = new Woman();
        woman.name = "李四";
        woman.age=19;
        woman.show();
    }
}

子类需要使用 extends 关键字来继承父类。通过这样的操作后,Person类中父类或者叫基类,而Man和 Woman 叫子类或者派生类。

2.3 继承的优点

  1. 提高了代码的复用率

  2. 它是多态前提条件

2.4 继承的缺点

  1. 父类中私有的属性和方法,子类是无法使用的

  2. 在java中只支持单继承,不支持多继承,但是可以支持多重继承

  3. 继承后子父类的关系就接合得非常的紧密,不利于程序的扩展,从而减少了程序的灵活性。

  4. 父类无法访问子类的属性和方法

三、多态

3.1 多态的定义

一个对象在不同条件下表示的不同形态就叫多态,在程序中,多态是父类引用指定子类对象。

// 多态
class Father {
    String name;
    public void desc() {
        System.out.println("----------");
        System.out.println(name + "小头爸爸");
    }
}
class Son extends Father {
    String name;
    public void desc() {
        System.out.println("+++++++++++++");
        System.out.println(name + "大头儿子");
    }
}

public class PolymorphicDemo1 {
    public static void main(String[] args) {
        Father father = new Son();
        father.name = "大头儿子";
        father.desc();
    }
}

另一种多态的使用方式是在方法的参数上,一般我们在使用工厂设计模式时会使用多态 。

//
abstract class Animal {
    abstract void haha();
}
class Cat extends Animal {
    @Override
    void haha() {
        System.out.println("Cat haha()");
    }
}
class Dog extends Animal {
    @Override
    void haha() {
        System.out.println("Dog haha()");
    }
}

class HelloKit {
    public static Animal create(Animal animal) {
        if (animal instanceof Cat) {
            return new Cat();
        }else if (animal instanceof Dog) {
            return new Dog();
        } else {
            return null;
        }
    }
}
public class HelloKitDemo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();

        Animal animal = HelloKit.create(cat);
        animal.haha();

        Animal animal1 = HelloKit.create(dog);
        animal1.haha();

    }
}

在参数列表上,使用父类去接收,也是一种多态的使用方式。

3.2 多态的使用要求

1,在多态的情况下,不能使用子类特有的方法

class Person {
    public int age = 5;
    public void show() {
        System.out.println("Person age: " + age);
    }
}
class Student extends Person {
    public int age = 10;
    public String name = "小明";
    public void show() {
        System.out.println("Student age: " + age);
    }
    public void speak() {
        System.out.println(name);
    }
}

public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Person p = new Student();
        p.show(); // 可以执行
        p.speak(); // 报错,因为 speak 方法是子类特有的方法
    }
}

2,多态在例子中如果属性是非静态的,它的值是看等号左边

// 多态的注意事项
class Person {
    public int age = 5;
    public void show() {
        System.out.println("Person age: " + age);
    }
}
class Student extends Person {
    public int age = 10;
    public String name = "小明";
    public void show() {
        System.out.println("Student age: " + age);
    }
    public void speak() {
        System.out.println(name);
    }
}

public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Person p = new Student();
        System.out.println(p.age); // 5 ,是不是 10
    }
}

原因:我们使用的是多态,也就是说我们输出的 p.age ,而 p 是父为的引用,它获取到的值就是父类中定义的值。

在多态下,编译是看等号的左边,运行时如果是属性则看等号左边。

3,在多态下的非静态方法

// 多态的注意事项
class Person {
    public int age = 5;
    public void show() {
        System.out.println("Person age: " + age);
    }
}
class Student extends Person {
    public int age = 10;
    public String name = "小明";
    public void show() {
        System.out.println("Student age: " + age);
    }
}

public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Person p = new Student();
        p.show();
    }
}

在多态下,编译是看等号的左边,运行时如果方法是非静态的看等号的右边。

4,在多态下的静态成员

// 多态的注意事项
class Person {
    public static void x() {
        System.out.println("Person static x");
    }
}
class Student extends Person {
    public static void x() {
        System.out.println("Student static x");
    }
}
public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Person p = new Student();
        p.x(); // Person static x
    }
}

在多态下,静态的成员在编译和运行时都看等号的左边。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web】2023浙江大学生省赛初赛 secObj 题解

目录 step 0 step 1 step 2 step 3 题目本身是不难,简单复健一下 step 0 pom依赖就是spring 反序列化入口在./admin/user/readObj 输入流做了黑名单的过滤,TemplatesImpl不能直接打 可以jackson打SignedObject二次反序列化绕过 具体原理看下面这…

基于ESP32和ESP8266的物联网开发过程(二)

在做这个项目前,也做了一些调研。项目的初衷是想要用于智能家居。我比较了小米IoT、阿里云、ESPHOME、巴沙云、点灯科技和ONENET等几个平台。最终选择了Onenet,部分原因是之前用过它的多协议版本,但现在这个版本已经下线了。 小米IoT的公测名…

基于JAVAEE的停车场管理系统(论文 + 源码)

【免费】基于JAVAEE的停车场管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89292324 基于JAVAEE的停车场管理系统 摘 要 如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤&…

深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

🔥 个人主页:空白诗 文章目录 🔥 引言🧱 原型基础⛓️ 原型链的形成🔄 修改原型的影响🏁 原型链的尽头为什么null标志着结束?实际意义 🌐 🔄 继承的实现方式1. 原型链继承…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547)1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞(CVE-2017-7529)1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

厦门建发弘爱医疗集团有限公司(简称“建发弘爱”)创立于2022年,是厦门建发医疗健康投资有限公司的全资子公司,专业从事医疗健康领域的医疗服务。 建发弘爱通过医疗、健康及产业服务三大板块,为百姓提供医疗和健康全生…

【MySQL基本查询(下)】

文章目录 一、update案例 二、Delete案例注意:delete 全表数据的行为慎用!truncate 三、插入查询结果案例 四、了解一些函数1.count函数2.sum函数3. avg函数4.max函数5. min函数 五、group by子句的使用案例having和where 一、update 该关键字的功能就是…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决:关键文件缺失,多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

Excel——项目管理,设置时间到期自动提醒及颜色高亮

效果图 第一步、自动获取合同到期日期 1、首先合同【签约日期】和【到期日期】下面的数据必须是日期格式,不能是其它的格式否则无法计算,如果是其它格式需要转换成标准的日期格式,如下图所示。 2、在“到期日期”下面的第一个单元格中输入公…

7 系列 FPGA 产品介绍及选型

目录 Spartan-7 FPGAsArtix-7 FPGAsKintex-7 FPGAsVirtex-7 FPGAsFPGA芯片命名规则DSP资源BRAM资源Transceivers 资源Transceivers 总带宽I/O 个数及带宽参考文档 Spartan-7 FPGAs Artix-7 FPGAs Kintex-7 FPGAs Virtex-7 FPGAs FPGA芯片命名规则 DSP资源 BRAM资源 Transceiver…

快速上手prometheaus grafana 监控

介绍 prometheaus 一个定时输出指标数据的巡检组件? grafana 一个读取指标,可视化的提供了好看界面的组件? 教程 如何和springboot项目集成 【IT老齐153】超级实用!十分钟掌握Prometheus与Grafana监控SpringBoot应用_哔哩哔哩_…

100000订单直接拒掉,君子爱财,取之有道

近一个月询盘可谓寥寥无几,成交率为0,今天好不容易接了一个客户询盘,订单总价高达100000,听完细节直接拒掉,至于原因懂的都懂,不懂得等我慢慢道来。 前两天有2个询盘,其中一个是二次开发&#x…

【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录 💥一、PPT模版爬取🔥1.1 第一个爬虫🚲1. 获取下载页面链接 ❤️1.2 第二个爬虫🚲1.3 第三个爬虫🎈2. 文件保存 ❤️1.4 翻页处理 🔥二、完整代码 🔥🔥🔥 Pytho…

大腾智能网站正式上线

4月30日,我们翘首以盼的时刻终于来临,大腾智能官网(www.da-teng.com)正式上线,我们对此感到无比兴奋和自豪!此刻,我们诚挚地邀请每一位朋友,共同踏上这个全新的数字之旅,…

从需求到实现的关键

版本封面 内容:产品logo,项目名称,所属公司,产品名称,文档类型,版本号,时间,相关人员(最好说明下负责人)。 作用: 突出重要信息,将…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义:定义如何实施项目风险管理活动的过程作用:确保风险管理的水平、方法和可见度与项目风险程度相匹配,与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…

debian10 (armbian) 配置CUPS 服务

更新apt apt-update安装相关软件 apt-get install ghostscript apt-get install dc apt-get install foomatic-db-engine apt-get install cups3.修改配置文件 nano /etc/cups/cupsd.conf Listen localhost:631改为 Listen 0.0.0.0:631 以下四段配置加入Allow All # Only li…
最新文章