Java三大特性:封装、继承、多态【详解】

封装

定义

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别便是封装。

在开发中造一个类就是封装,有时也会说封装一个类。封装可以隐藏一些细节或者包含数据不能被随意修改。

比如这是一个敏感的数据,我不能够让别人直接操纵到这个数据,因此我用private把它包装起来,对外通过一个public的接口给别人使用它的权限。

在程序中,为防止类的属性被无操作导致程序错误,所以属性也是不允许外部直接操作的,要通过固定的放回操作,例如get/set方法

权限

提到封装,就不得不提到访问权限,它的目的是为了在代码中表示具体的属性或方法的访问权限

权限修饰符一共有4个:public、protected、缺省、private

访问范围privatefriendly(默认)protectedpublic
同一个类可访问可访问可访问可访问
同一个包中的其他类不可访问可访问可访问可访问
不同包中的子类不可访问不可访问可访问可访问
不同包中的非子类不可访问不可访问不可访问可访问

get/set方法

通过 public 的方法提供对私有字段的访问。这些方法通常称为 “getter” 和 “setter”。

具体写法:

  • boolean数据类型的写法是,get方法:isXxx()(xxx是属性的名字),set方法:setXxx(boolean xxx)。注意大写小,属性的名字是xxx,is和set后都首字母大写了;
  • 除了boolean数据类型,写法都是,get方法getXxx(),set方法setXxx(数据类型 参数)。

IDEA生成get/set方法

在这里插入图片描述

继承

定义

现实生活中,子女能够继承父母拥有的财产,而在程序中也是一样的。

程序中的继承指的是子类拥有父类的特征和行为,这是类与类之间的一种关系。它不仅可以继承父类的代码,还能对其进行复用,扩展和修改。

Java对接口允许多实现,但对类只支持单继承,也就是说一个类有且只有一个父类。

【补充:超类】:超类(父类)是被其他类继承的类。它包含共享的属性和行为,子类通过继承超类来复用这些属性和行为。超类通常代表了某一类对象的通用特征,而子类则在此基础上扩展或修改功能。

在这里插入图片描述

超类(父类)(Superclass 或 Base Class):被继承的类,提供共享的属性和方法。
子类(Subclass 或 Derived Class):继承超类的类,拥有超类的属性和方法,同时也可以新增自己的属性和方法。

例子

// 超类(父类)
class Animal {
    String name;

    // 父类构造方法
    public Animal(String name) {
        this.name = name;
    }

    // 父类的方法
    public void speak() {
        System.out.println("动物在叫");
    }

    public void eat() {
        System.out.println("动物在吃东西");
    }
}

// 子类(继承自Animal)
class Dog extends Animal {

    // 子类构造方法,调用父类构造方法
    public Dog(String name) {
        super(name);  // 使用 super 调用父类构造方法
    }

    // 重写父类的方法
    @Override
    public void speak() {
        System.out.println(name + " 说:汪汪");
    }

    // 子类新增方法
    public void bark() {
        System.out.println(name + " 在叫");
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建 Dog 对象
        Dog dog = new Dog("Buddy");

        // 调用父类继承过来的方法
        dog.eat();  // 输出: 动物在吃东西

        // 调用子类重写的方法
        dog.speak();  // 输出: Buddy 说汪汪

        // 调用子类独有的方法
        dog.bark();  // 输出: Buddy 在叫
    }
}

注意

  • 权限修饰符,重写的权限修饰符要大于或等于父类方法的的权限修饰符(public>protected>缺省的>private);

  • final修饰的方法不能被重写;

  • static修饰的方法不能被重写,如果子类的方法也用static修饰,也不构成方法的重写,而是在子类中声明了一个属于子类的静态方法

super关键字

super关键字在 Java 中用于引用父类的成员。它的作用是访问父类的方法和构造函数,类似于 this 关键字,但 this 是指当前对象,而 super 指向父类的对象。使用 super 可以在子类中调用父类的方法,特别是在子类重写了父类的方法时。

主要用法和注意事项:
调用父类的方法:
super 可以用来调用父类的方法。但调用时要注意方法的访问权限,必须确保父类的方法是可访问的(例如,方法的访问修饰符不能是 private,否则无法访问)。

调用父类的构造方法:
在子类的构造函数中,通常会隐式地调用父类的无参构造方法。如果父类没有无参构造函数,子类则必须显式地调用父类的构造方法。调用父类构造方法时,可以使用 super()。例如,如果父类只有带参数的构造函数,子类需要通过 super(参数) 来调用父类的构造方法。

默认继承 Object 类:
在 Java 中,所有类都默认继承自 Object 类。也就是说,如果你没有显式地声明 extends Object,Java 会自动为你添加这一部分。比如,public class Person {} 和 public class Person extends Object {} 是等效的。

方法重写中的 super:
当子类重写了父类的方法后,如果希望调用父类版本的方法,而不是子类重写后的方法,可以使用 super。这在方法重写中尤为常见,尤其当子类需要在保留父类方法的基础上添加自己的行为时。

instanceof(补充)

instanceof是一个双目运算符,运算的结果是一个boolean数据类型,表示是否是某种数据类型。变量 instanceof 某数据类型A 如果变量是A数据类型则返回true,否则返回false。

public class Demo003 {

    public static void main(String[] args) {
        Object i1 = 10;//Integer是一个引用数据类型,表示正数,与int可以相互转换
        System.out.println(i1 instanceof Integer);
        System.out.println(i1 instanceof Object);
        System.out.println(i1 instanceof Teacher);
        System.out.println("-------------------------");
        Teacher teacher = new Teacher();
        System.out.println(teacher instanceof Teacher);
        System.out.println(teacher instanceof Person);
        System.out.println(teacher instanceof Object);
    }

}

结果:

true
true
false
-------------------------
true
true
true

多态

定义

多态是面向对象的一个重要特征,它是指在父类中定义好了属性和方法,子类继承父类之后可以具有不同的数据类型表现或者不同的行为。

同一件事情,发生在不同对象的身上,就会产生不同的结果。核心的一句话:父类引用指向子类对象。

例如:Animal类有makeSound(发出声音)方法,子类Dog和Cat的makeSound方法都有不同的实现,当调用makeSound方法时会根据具体对象的实现而执行。

public class Animal {

    public void makeSound(){
        System.out.println("动物发出的声音");
    }

}
public class Cat extends Animal {

    @Override
    public void makeSound(){
        System.out.println("喵喵喵");
    }

}
public class Dog extends Animal {

    @Override
    public void makeSound(){
        System.out.println("汪汪汪");
    }

}
public class Main {

    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound();
        Animal dog = new Dog();
        dog.makeSound();
        Animal cat = new Cat();
        cat.makeSound();
    }

}

输出结果:

动物发出的声音
汪汪汪
喵喵喵

转型问题

数据类型的转换包括:向上转型和向下转型
向上转型:向父类转换,可以直接赋值。
向下转型:向子类转换,需要进行强制类型转换。

例子:

public class DataType {

    public static void main(String[] args) {
        /*String数据类型是Object类型的子类*/
        Object o1 = new Object();
        String s1 = "a";
        /*向上转型*/
        Object o2 = s1;
        System.out.println(o2);
        Object oString = "b";
        /*向下转型*/
        String sObject = (String)oString;
        System.out.println(sObject);
        /*向下转型,但是会报错,原因是o1是Object数据,而且存放的数据也不是一个String数据类型的数据*/
        /*强制转换有时候语法上不会报错,但运行时会报错*/
        String s2 = (String)o1;
        System.out.println(s2);
    }

}

数据类型的传递

在不同数据类型的情况下,值的传递是不同的。

基础数据类型

基础数据类型作为参数传递时候,传递的是值,也就说在方法中修改这个参数的值,不会影响到实参的数据。

这个也叫做值传递

public class Type {

    public static void testInt(int a){
        System.out.println("进入方法,在修改值之前:" + a);
        a = 10;
        System.out.println("进入方法,在修改值之后:" + a);
    }

    public static void main(String[] args) {
        int a = -10;
        System.out.println("在进入方法之前:" + a);
        testInt(a);
        System.out.println("在方法执行之后:" + a);
    }

}

结果:

在进入方法之前:-10
进入方法,在修改值之前:-10
进入方法,在修改值之后:10
在方法执行之后:-10

引用数据类型
JDK提供的大多数数据类型,传递的是对象的引用,也就是地址,会修改实参的数据,这个也叫做引用传递。

public class Type {

    public static void main(String[] args) {
        Student student = new Student();
        student.setName("小明");
        student.setAge(10);
        System.out.println("在进入方法之前:" + student.getName() + "的年龄是:" + student.getAge());
        testStudent(student);
        System.out.println("在方法执行之后:" + student.getName() + "的年龄是:" + student.getAge());
    }

    public static void testStudent(Student student){
        System.out.println("进入方法,在修改值之前:" + student.getName() + "的年龄是:" + student.getAge());
        student.setName("大明");
        student.setAge(20);
        System.out.println("进入方法,在修改值之前后:" + student.getName() + "的年龄是:" + student.getAge());
    }

}
public class Student {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

结果:

在进入方法之前:小明的年龄是:10
进入方法,在修改值之前:小明的年龄是:10
进入方法,在修改值之前后:大明的年龄是:20
在方法执行之后:大明的年龄是:20

少数:不修改实参数据
String,Integer,Long…

public class Type {

    public static void main(String[] args) {
        String str = "我是原始字符串";
        System.out.println("在进入方法之前:" + str);
        testString(str);
        System.out.println("在方法执行之后:" + str);
    }

    public static void testString(String str){
        System.out.println("进入方法,在修改值之前:" + str);
        str = "我被修改了";
        System.out.println("进入方法,在修改值之后:" + str);
    }
}

结果:

在进入方法之前:我是原始字符串
进入方法,在修改值之前:我是原始字符串
进入方法,在修改值之后:我被修改了
在方法执行之后:我是原始字符串

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

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

相关文章

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器(功能扩展) 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径: OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常,您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

苹果系统中利用活动监视器来终止进程

前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候,就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢? 解决办法 Commandspace 弹出搜索框吗,如下图: 输入“活动”进行搜索&#xff…

实战项目负载均衡式在线 OJ

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能自己实现负载均衡式在线 OJ。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自&#xff1…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

burp suite-1

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…

【区块链】深入理解椭圆曲线密码学(ECC)

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

【Qt流式布局改造支持任意位置插入和删除】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、源代码二、删除代码三、扩展总结 前言 最近在做一个需求需要流式布局,虽然官方example里有一个流式布局范例,但是不能满足我的需求…

JQuery -- 第九课

文章目录 前言一、JQuery是什么?二、JQuery的使用步骤1.引入2.书写位置3. 表示方法 三、JQuery选择器1.层级选择器2. 筛选选择器3. 排他思想4. 精品展示 四、jQuery样式操作1. 修改样式2.类操作1. 添加2. 移除3. 切换 五、jQuery动画1. 显示和隐藏2. 滑动1. slide2.…

Python 版本的 2024详细代码

2048游戏的Python实现 概述: 2048是一款流行的单人益智游戏,玩家通过滑动数字瓷砖来合并相同的数字,目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能,包括游戏逻辑、界面绘制和用户交互。 主…

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

大家好,我是锋哥。今天分享关于【在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?】面试题。希望对大家有帮助; 在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的? 在 Elasticsearch 中…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构,用于表示节点(顶点)之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的(边有方向)或无向的(边没有方向),可以是加权的&#xff…

Mac 系统上控制台常用性能查看命令

一、top命令显示 在macOS的控制台中,top命令提供了系统当前运行的进程的详细信息以及整体系统资源的利用情况。下面是对输出中各个字段的解释: Processes: 483 total: 系统上总共有483个进程。 2 running: 当前有2个进程正在运行。 481 sleeping: 当前有…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题,NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

极简开源Windows桌面定时提醒休息python程序

当我们长期在电脑面前坐太久后,会产生一系列健康风险,包括干眼症,颈椎,腰椎,肌肉僵硬等等。解决方案是在一定的时间间隔内我们需要have a break, 远眺可以缓解干眼症等眼部症状,站起来走动两步,…

Windows Qtcreator不能debug 调试 qt5 程序

Windows下 Qt Creator 14.0.2 与Qt5.15.2 正常release打包都是没有问题的,就是不能debug,最后发现是两者不兼容导致的; 我使用的是 编译器是 MinGW8.1.0 ,这个版本是有问题的,需要更新到最新,我更新的是Mi…

【论文笔记】Number it: Temporal Grounding Videos like Flipping Manga

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Number it: Temporal Grou…

【模版进阶】—— 我与C++的不解之缘(十八)

前言: ​ 之前浅浅的学了一下模版,这里来深入学习一下模版 1、非类型模版参数 模版参数可以分为类型形参 和非类型形参 类型形参:出现在模板参数列表中,跟在**class或者typename**之类的参数类型名称。非类型形参: 就是…