[Javase]封装、继承、多态与异常处理

文章目录

  • 一、前言
  • 二、封装
    • 1、封装的思想
    • 2、封装代码层面的体现
  • 三、继承
    • 1、继承的概念和好处
    • 2、继承代码层面的体现
  • 四、多态
    • 1、多态的概念
    • 2、多态的好处和三要素
    • 2、多态代码层面的体现
  • 五、异常处理
    • 1、try-catch-finally结构详解
    • 2、throw\throws

一、前言

本文章适合有一定面向对象基础的读者阅读。如果你对Java编程尚不熟悉,建议先转向传送门,阅读之前的入门文章,以便更好地理解后续内容。


二、封装

1、封装的思想

封装是面向对象编程(OOP)的一个核心概念,它的主要思想是隐藏对象的内部细节,只暴露必要的接口供外部访问和操作。通过封装,我们可以确保对象的内部状态不被外部随意修改,从而保护对象的完整性。同时,封装还可以提供灵活的接口,使得对象的行为可以根据需要进行调整而不会影响其内部结构。

封装的核心在于 “信息隐藏” 和 “抽象” 。信息隐藏意味着将对象的内部状态(即其属性和方法)封装起来,只通过公共接口与外部进行交互。抽象则是指将对象的复杂性和细节隐藏起来,只展示其最本质的特征和功能。

2、封装代码层面的体现

在Java编程语言中,封装这一面向对象编程的核心概念,主要通过运用访问修饰符(具体包括private、protected、public以及默认的访问权限)以及getter和setter方法这两大手段得以实现。

  • private:表示私有,仅类内部可以访问和修改,实现了最大程度的封装和隐藏。
  • protected:表示受保护,子类以及同一个包内的其他类可以访问。提供了一定程度的封装,同时允许子类继承访问。
  • public:表示公共,任何地方都可以访问。虽然不符合封装原则中的信息隐藏,但在需要对外提供接口时必不可少。
  • 默认访问级别:没有修饰符,表示类、方法或变量可以被同一个包内的其他类访问。这提供了一定程度的封装,但仅限于包内。
public class Person {    //私有属性,外部无法直接访问  private String name;  private int age;  //构造方法  public Person(String name, int age) {    this.name = name;    this.age = age;    }//Setter方法,用于设置属性值public void setName(String name) {this.name = name;}//Getter方法,用于获取属性值  public String getName() {    return name;    }  //Setter方法,用于设置属性值,并包含简单的验证逻辑  public void setAge(int age) {    if (age > 0) {    this.age = age;    } else {    throw new IllegalArgumentException("年龄不能小于零");  }  }  //Getter方法,用于获取年龄属性(注意:虽然在此示例中未直接展示,但通常也会为age属性提供getter方法)  public int getAge() {    return age;    }  
}

在这个示例中,我们将Person类的name和age属性设置为私有,从而限制了外部直接访问这些属性的能力。然后,我们通过提供公共的getter和setter方法来允许外部代码以受控的方式访问和修改这些属性的值。这种封装机制不仅保护了对象的内部状态,还使得我们能够在setter方法中添加额外的验证逻辑,以确保对象的状态始终保持有效和一致。


三、继承

1、继承的概念和好处

类是对具有相似属性和方法的对象的抽象,而继承则是对具有层级或 “是一种” 关系的类之间的进一步抽象。通过继承,子类可以继承父类的属性和方法,从而简化代码,提高代码的可重用性和可维护性。

请添加图片描述

2、继承代码层面的体现

继承的好处是,子类不用重复定义某些东西。

//父类  
class Animal {  private String name;private int age;public void eat() {  System.out.println(name + "觅食");  }public void call() {System.out.println(name + "大叫");}
}  //子类  
class Dog extends Animal {  public void special() {  System.out.println(name + "在看家");  }//对不满意的方法进行重写public void call() {System.out.println(name + "汪~汪叫");}
}  public class InheritanceDemo {  public static void main(String[] args) {  Dog dog = new Dog();  dog.name = "小汪";  dog.eat();//继承自父类的方法  dog.special();//子类自己的方法dog.call();//重写的方法}  
}

在这个例子中,Dog类继承了Animal类,并添加自己的方法。Dog对象可以调用从Animal类继承的方法,以及自己添加的方法。


四、多态

1、多态的概念

多态是面向对象编程的一个重要特性,它允许我们使用父类类型的引用来指向子类对象。通过这种方式,我们可以在运行时动态地确定要调用哪个类的方法,而不是在编译时确定。

2、多态的好处和三要素

多态提高了代码的灵活性和可扩展性,简化了代码结构,并实现了接口与实现的分离,使我们能够轻松添加新子类而无需修改现有代码,同时用统一接口调用不同实现。

  • 继承:多态的前提是存在继承关系。
  • 重写:子类需要重写父类中的方法,以实现多态的行为。
  • 父类引用指向子类对象:这是多态的实现方式,允许我们在不知道具体子类类型的情况下调用方法。

2、多态代码层面的体现

多态跟属性无关,多态指的是方法的多态,而不是属性的多态。

//父类  
class Animal {  public void sound() {  System.out.println("Some generic animal sound");  }  
}  //子类1  
class Dog extends Animal {  public void sound() {  System.out.println("Woof! Woof!");  }  
}  //子类2  
class Cat extends Animal {  public void sound() {  System.out.println("Meow! Meow!");  }  
}  public class PolymorphismDemo {  public static void main(String[] args) {//父类引用指向子类对象Animal myDog = new Dog();Animal myCat = new Cat();  myDog.sound();//调用Dog类的sound方法  myCat.sound();//调用Cat类的sound方法  }  
}

在这个例子中,myDog和myCat都是Animal类型的引用,但它们分别指向Dog和Cat对象。当我们调用sound方法时,Java虚拟机在运行时确定要调用哪个类的方法,从而实现多态。


五、异常处理

1、try-catch-finally结构详解

try块里放的是可能会出错的代码,一旦出错,就会跳到catch块去处理这个错误。而finally块,不管出没出错,它都会执行,常常用来做一些收尾工作,比如关掉打开的文件或释放资源。

public class test {public static void main(String[] args) {try {int num1 = 12;int num2 = 0;System.out.println(num1 / num2);} catch(Exception ex) {//捕获异常并处理System.out.println("程序异常");} finally {System.out.println("无论是否出异常都执行");}}
}

2、throw\throws

throw用于显式抛出异常对象,中断当前方法执行并传递给调用者,其后必须是Throwable实例。而throws是方法声明中的关键字,用于指明方法可能抛出的异常类型,调用者需对此进行处理,或继续向上层抛出。

public class test {public static void main(String[] args) {//调用者需要对可能抛出异常的方法进行处理(也可继续抛出)try {dev();} catch(Exception ex) {System.out.println("程序异常");}}//这是一个可能抛出异常的函数(使用throws声明)  public static void dev() throw Exception {int num1 = 13;int num2 = 0;if (num2 == 0) {throw new Exception();//显式地创建并抛出一个异常对象} else {System.out.println(num1 / num2);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.15.2024刷华为OD C题型(二)

10.15.2024刷华为OD C题型(二) 密码输入检测智能成绩表 如果是目标院校150分能过,而且这道题是两百分的话我就阿弥陀佛了。 这类简单类型的字符串处理题目一看就有思路,起码能做,遇到那种稍微加点数学的,感…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number)。给你一个整数 x 。如果 x 是 哈沙德数 ,则返回 x 各个数位上的数字之和,否则,返回 -1 。 示例 1: 输入&am…

MySQL增删改进阶

目录 1.数据库约束 1.1约束类型 1.2 not null约束 1.3 unique:唯一约束 1.4 default:默认约束 1.5 primary key:主键约束 1.6 foreign key:外键约束 1.7 check约束(了解) 2.表的设计 3.新增(进阶&…

刷题训练之多源 BFS

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握多源 BFS算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷…

C++(stack和queue)

1. stack的介绍、使用和实现 1.1 stack的介绍 stl里的stack其实和数据结构内的stack和前面数据结构的栈不能说百分百一样,但也有百分之90是一样的,他们的特性都是LIFO(last in first out)先进后出的原则,前面有类似的…

VideoCLIP-XL:推进视频CLIP模型对长描述的理解

摘要 对比语言-图像预训练(CLIP)已被广泛研究并应用于众多领域。然而,预训练过程中对简短摘要文本的重视阻碍了CLIP理解长描述的能力。在视频方面,这个问题尤为严重,因为视频通常包含大量详细内容。在本文中&#xff…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

Leetcode 1489. 找到最小生成树里的关键边和伪关键边

1.题目基本信息 1.1.题目描述 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一…

MFC扩展库BCGControlBar Pro v35.1新版亮点:改进网格控件性能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.1已全新发布了,这个版本改进网格控件的性能、增强工具栏编辑器功能等。 …

【puppeteer】wvp-puppeteer制作 过程

目录 最后的结论 制作windows&ubuntu的docker 重启桌面上的docker 命令重启 通过 Docker Desktop 图形界面重启 制作centos docker 测试 参考文档 最后的结论 ubuntu && windows 使用 dualvenregistry:5000/wvp-puppeteer:1.0 centos7 使用:…

通过OpenCV实现 Lucas-Kanade 算法

目录 简介 Lucas-Kanade 光流算法 实现步骤 1. 导入所需库 2. 视频捕捉与初始化 3. 设置特征点参数 4. 创建掩模 5. 光流估计循环 6. 释放资源 结论 简介 在计算机视觉领域,光流估计是一种追踪物体运动的技术。它通过比较连续帧之间的像素强度变化来估计图…

第6篇:无线与移动网络

目录 引言 6.1 无线网络的基础概念 6.2 无线局域网(WLAN)与IEEE 802.11 6.3 蓝牙与无线个域网(WPAN) 6.4 无线城域网(WMAN)与WiMax 6.5 ZigBee与智能家居 6.6 移动蜂窝网络(3G/4G/5G&…

【Linux】总线-设备-驱动模型

背景 前面,我们介绍了写驱动代码的一些常规步骤,并且也写了最基本的驱动代码,但是那些代码存在着问题,我们将硬件的信息都写进了驱动里了,如果我们在杂项设备驱动中控制led,那么会在硬件操作接口中包含硬件…

【SQL实验】数据库、表、模式的SQL语句操作

完整代码在文章末尾 1、数据库的建立、删除和修改操作 (1)使用SQL语句创建数据库EDUC,并进行如下设置: 数据库文件和日志文件的逻辑名称分别为:Student_data和Student_log;数据文件的物理文件名为‘C:\DA…

基于Java语言的培训平台+学习平台+在线学习培训系统+教育平台+教育学习系统+课程学习平台

简述 企业培训平台企业考试系统培训平台考试系统企业大学企业视频网站视频学习平台 介绍 企业培训平台支持企业培训考试全流程,在线学习、在线考试,成熟的企业培训考试解决方案,充分满足企业培训需求。 独立部署,仅内部员工登录…

【热门】智慧果园管理系统解决方案

随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…

03.顺序表实现

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。一般见到的顺序表都是在结构体中定义的数组,只是比普通数组多了增删改查等一些其他功能函数。 上节已经介绍了顺序表有…

【android studio】Gradle和Gradle插件版本关系/配置/常见ERR示例

参考链接: Android之Gradle和Gradle插件区别及联系 grdle 的安装与配置 、gradle和jdk版本对应关系 Android Gradle Plugin与Gradle版本、JDK版本对应关系 配置示例 常见err 主要原因 1.编译版本未设定 2.有多个module而且gradle 版本设置不一致 修改如下&#xf…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的,图像将以原…