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

news2024/10/16 23:33:58

文章目录

  • 一、前言
  • 二、封装
    • 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.coloradmin.cn/o/2211714.html

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

相关文章

CMake 教程跟做与翻译 4

目录 添加一个option! 添加一个option! option,正如其意,就是选项的意思。我们这里需要演示一下option的做法。 option对于大型的工程必然是非常常见的:一些模块会被要求编译,另一些客户不准备需要这些模块。option就是将这种需…

【LLM KG】浅尝基于LLM的三阶段自动知识图谱构建方法

文章指出,在以前的方法中,使用LLM生成三元组时,必须预定义好schema,假如schema数量很多/复杂,很容易超过LLM的上下文窗口长度。并且,在某些情况下,没有可用的固定预定义schema。 方法 一、EDC…

计算机网络:数据链路层 —— 网络适配器与 MAC 地址

文章目录 网络适配器使用网络适配器网络适配器类型 MAC 地址MAC 地址格式MAC 地址类型MAC 地址发送顺序数据接收MAC 地址泄露问题 网络适配器 要将计算机连接到以太网,需要使用相应的网络适配器(Adapter),网络适配器一般简称为“网卡”。在计…

通信工程学习:什么是SRAM静态随机存取存储器

SRAM:静态随机存取存储器 SRAM,全称为Static Random-Access Memory,即静态随机存取存储器,是一种重要的随机存取存储器类型。以下是对SRAM的详细介绍: 一、定义与特点 定义: SRAM是一种只要保持通电&#…

CSS @规则(At-rules)系列详解___@import规则使用方法

CSS 规则(At-rules)系列详解 ___import规则使用方法 本文目录: 零、时光宝盒 一、import规则定义和用法 二、CSS import语法 2.1、语法格式 2.2、常见形式 2.3、语法说明 三、import使用方法例子 3.1、导入 CSS 规则 3.2、根据媒体查询条件导入 CSS 规则 …

结构体字节对齐的一些记录

‌结构体字节对齐的原因‌ 结构体字节对齐的主要原因是为了满足硬件平台的内存访问要求。某些硬件平台对特定类型的数据只能从特定的内存地址开始存取,如果数据没有进行对齐,可能会导致访问错误或效率低下。例如,某些架构的CPU在访问未对齐的…

原来CDC数据同步可以这么简单,零代码可视化一键数据同步

当前企业实时同步与分析场景中面临的挑战: 随着业务发展需要,实时分析成为企业目前的强需求,成为支撑企业业务发展的必须项。 一般来说,要满足数据实时分析的诉求,通常有两种方案: 第一种是直接使用源端…

多线程——解决线程安全问题

目录 前言 一、 synchronized 关键字 1. synchronized 的作用 1. synchronized 的特性 (1)互斥性 (2)可重入 2. synchronized 使用示例 (1)修饰代码块 (2)直接修饰普通方法…

Linux的GDB学习与入门

GDB GDB(GNU Debugger)是一个功能强大的调试工具,广泛用于调试 C、C 和其他编程语言编写的程序。它是 GNU 项目的一部分,专为帮助开发者在程序执行时检测和修复错误设计。GDB 能够控制程序的执行,查看程序内部的状态&…

2024诺奖引发思考,AI究竟是泡沫还是未来?

你好,我是三桥君 现在的AI技术发展得非常快,特别是深度学习和大模型这些技术,感觉和以前那些最后没搞成的技术泡沫不一样。 现在AI有超级强大的计算能力,还有大量的数据可以用来训练,算法也越来越厉害,能搞…

【单机游戏】【烛火地牢2:猫咪的诅咒】烛火地牢2:猫咪的诅咒介绍

《烛火地牢2:猫咪的诅咒》是一款将Roguelike与2D横版动作融为一体的独立游戏,由新西兰制作人Chris McFarland耗费3年时间精心制作。玩家将闯入不同的关卡接受挑战,通关要求是寻找每个关卡中的钥匙。在闯关时玩家能获得武器,防具&a…

关于int*的*号归属权问题

再根据函数指针定义:int (*int) (int a)。我们发现*和后面的标识符才是一体的 所以int *a,b;的写法更好,说明a是指针类型,b是int类型

让Kimi像人类思考的“Kimi探索版“已开启灰度内测!GPT-o1贡献者之一宣布离职|AI日报

文章推荐 “AI教父”辛顿与物理学家霍普菲尔德荣获诺贝尔物理学奖!“AI教母”李飞飞选择谷歌云作为主要计算提供商|AI日报 今日热点 o1推理模型贡献者Luke Metz官宣从OpenAI离职 就在昨日,o1推理模型贡献者之一Luke Metz发文称自己经过两…

Ofcms-(java代码审计学习)

1、背景 根据《java代码审计实战》学习进行记录,java代码审计CMS实战。 2、Ofcms下载 可搜索Ofcms1.1.2版本进行下载。下载连接:ofcms: java 版CMS系统、基于java技术研发的内容管理系统、功能:栏目模板自定义、内容模型自定义、多个站点管…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot(UI基类) 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中,继承了基类的两个方法,设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

DDPM - Denoising Diffusion Probabilistic Models 扩散模型

DDPM - Denoising Diffusion Probabilistic Models 扩散模型 扩散模型概述 扩散模型是在模拟图像加噪的逆向过程。也就是在实现一个去噪的过程。简单的来说就包括两个过程组成 前向的扩散过程 Forward Diffusion Process反向扩散过程 Reverse Diffusion Process 下面我们对整个…

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用 专题一、生态系统服务评价技术框架 1.1 生态系统服务概述 1.2 流域生态系统服务的分类与作用 1.3 生态系统服务评估方法 专题二、AI大模型与生态系统服务评价 2.1 目前常用大模型介绍 2…

Java并发 - AQS之ReentrantLock

文章目录 ReentrantLockAQS 队列AbstractOwnableSynchronizerAbstractQueuedSynchronizerNodewaitStatusSHARED/EXCLUSIVE 模式 加锁流程尝试加锁 tryAcquire加锁失败入队addWaiterenq 阻塞等待 acquireQueuedparkAndCheckInterrupt 放弃加锁 cancelAcquire唤醒阻塞线程 unpark…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed(微软)3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

arcpy总结

arcpy 一、是什么二、为什么三、怎么用1、在哪里打开2、基础术语3、代码组织4、案例(1)裁剪(2)土地变化特征分析(4)文件访问与检测(5)空间数据的查询、插入与更新(6&…