Java继承——抽象类与接口的比较以及内部类、匿名类、异常类......

news2025/4/17 17:36:20

文章目录

  • 壹、抽象类与接口的比较
  • 贰、内部类
  • 叁、匿名类(匿名内部类)
  • 肆、异常类(Exception)

壹、抽象类与接口的比较

1、抽象类与接口都可以有抽象方法;
2、接口中只可以有常量,不可以有变量;而抽象类中既可以有常量也可以有变量;
3、抽象类中可以有非抽象方法,而接口不可以(因为接口中的方法默认为abstract);

在这两者中,通常什么时候使用抽象类,什么时候使用接口呢?

这两者本质上~~都是让设计忽略细节,将重心放在整个系统的设计上面 。
抽象类除了提供抽象方法外,还为子类提供非抽象方法和变量。如果某个问题需要利用继承才能更好的解决,如子类除了需要父类的抽象类,还需要从父类中继承一些变量或者非抽象方法,则选择抽象类。
反之,如果某个问题不需要继承,只需要利用一些方法来实现的话,就选择接口。

贰、内部类

我们知道一个类中由两部分构成——成员变量与方法,本章节所学的内部类,也可以作为其中的成员。
1、定义:所谓内部类,简单点来说,就是在一个类中,再构造一个类。此时最外面的类我们称为外部类(或外嵌类),那么在外部类中的,我们称为内部类(或内嵌类)。
2、格式:

class Outer
{
class Inter
{}
}

3、规则:
(1)内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
(2)内部类是另外一种封装,对外部的其他类隐藏。(这里我们后面会讲到其他外部类如何访问内部类方法)
(3)内部类打破了java的单继承局限,可以实现多继承;
注意:内部类也有缺点,设计起来比较繁琐,不便于大项目的对接工作。

4、代码展示

class A
{
    public void tell1()
    {
        System.out.println("I am A.");
    }
}
class B
{
    public void tell2()
    {
        System.out.println("I am B");
    }
}

class Outer{
    private String str ="外部类中的字符串";
    //定义一个内部类
    class Inner1 extends A{
        private String inStr= "内部类中的字符串";
        public void print(){
            //调用外部类的str变量
            System.out.println(str);
        }
    }
    //定义另一个内部类
    class Inner2 extends B{
        public void print1()
        {
            //调用外部类的str变量
            System.out.println(str);
        }
    }

    //在外部类中定义一个方法,该方法负责产生内部类对象并调用print()方法
    public void fun(){
        //内部类对象
        Inner1 inner1 = new Inner1();
        Inner2 inner2 =new Inner2();
        //内部类1对象提供的print
        inner1.print();
        inner1.tell1();
        //内部类1对象提供的print
        inner2.print1();
        inner2.tell2();
    }
}
public class Test{
    public static void main(String[] args)
    {
        //创建外部类对象
        Outer out = new Outer();
        //外部类方法
        out.fun();
    }
}

结果展示

外部类中的字符串
I am A.
外部类中的字符串
I am B
进程已结束,退出代码0

叁、匿名类(匿名内部类)

1、定义:匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口
2、几点说明:
(1)匿名类不能时abstract类,因为系统在创建内部类的时候,会立即创建出一个相关内部类对象。
(2)匿名内部类不等定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块。
3、格式

abstract class Father{...}

public class Test{
 Father H1=new Sonone(){
 匿名类类体
}

4、(1)和子类有关的匿名类
这个格式很多人应该时有点懵的,new出一个“Father”,后面跟的不是分号,竟然是大括号。
让我来为大家解释一下,一个抽象类是不能直接new 的,必须先有实现类了,才能new出它的实现类这里的“Father”是类名,而这里的实现类即为匿名类。看下面一段代码:

class SonOne extends Father{
  ...       //这里的代码和上面匿名内部类,大括号中的代码是一样的
}
public class Test{
   Father f1 = new SonOne() ;
} 

简单点来说,匿名类就是作为子类继承了某一个父类。
(2)和子类有关的匿名类
只需要把接口换成子类即可。

肆、异常类(Exception)

1、所谓异常,就是当你允许代码时候,中间由于某些原因,导致无法正常运行。

Exception in thread “main” java.lang.NoClassDefFoundError: org/a......

异常对象可以调用以下几种方法来获取异常信息:

public String getMessage();
public void printStackTrace();
public String toString();

2、处理异常的几种机制
(1)try-catch语句:Java内处理异常,通常会把会发生异常的语句放在try后面;

try{
	包含可能发生异常的语句
}
catch(ExceptionSubClass1 e){
	...
}
catch(ExceptionSubClass2 e){
	...
}

看下面的例子

public class Example3_1 {
    public static void main(String[] args) {
        int n = 0, m = 0, t = 1000;

        try {
            m = Integer.parseInt("8888");
            n = Integer.parseInt("ab89"); //发生异常,转向catch
            t = 7777;  //t没有机会被赋值
        } catch (NumberFormatException e) {
            System.out.println("发生异常:" + e.getMessage());
        }
        System.out.println("n=" + n + ",m=" + m + ",t=" + t);

        try {
            System.out.println("故意抛出I/O异常!");
            throw new java.io.IOException("我是故意的");
            //System.out.println("这个输出语句肯定没有机会执行,所以必须注释掉,否则编译出错");
        } catch (java.io.IOException e) {
            System.out.println("发生异常:" + e.getMessage());
        }
    }
}

在这里插入图片描述
(2)try-catch-finally

try{ }
catch(ExceptionSubClass e){ }
finally{}

其执行机制是在执行try~catch语句后,执行finally 子语句,也就是说,无论在try部分是否发生过异常,finally 子语句都会被执行.

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

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

相关文章

Mac | 使用 Wineskin 在 Mac 上运行 exe 程序

​1 Wineskin 简介 Wineskin is a user-friendly tool used to make ports of Microsoft Windows software to macOS. 很多实用工具只有 Windows 版本,而 Mac 机器本身不支持运行 exe 程序,除了安装双系统、虚拟机等方法外,Wineskin 可以将…

使用HTML+CSS实现一个静态页面——面包蛋糕 (9页)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

xlsx库实现纯前端导入导出Excel

前言 最近做了前端导入、导出 Excel 的需求,用到了js-xlsx这个库,该库文档提供的用例很少,并不是很友好。本文总结一下我是如何实现需求的。 需求 提供一个 Excel 文件,将里面的内容转成 JSON 导入数据提供一个 JSON 文件&…

3D-2D:PnP

直接线性变换 Perspective-n-Point 是求解3D到2D点对运动的方法。它描述了已知n个3D空间点及其投影位置时,如何估计相机的位姿。 2D-2D的对极几何方法需要8个或8个以上的点对(以八点法为例),且存在初始化、纯旋转和尺度的问题。然而,如果两张…

【数据挖掘】数据预处理

Outline ChapterOverview1.为什么要对数据预处理2.数据描述性总结3.数据清洗4.数据变换5.数据整合6.数据归约7.离散化与概念层级8.总结Chapter 1. 为什么要预处理 我们从现实生活中获得的原始数据,或多或少会因为各种原因不能直接使用。例如: 不完整 …

K8S Pod Sidecar 应用场景之一-加入 NGINX Sidecar 做反代和 web 服务器

Kubernetes Pod Sidecar 简介 Sidecar 是一个独立的容器,与 Kubernetes pod 中的应用容器一起运行,是一种辅助性的应用。 Sidecar 的常见辅助性功能有这么几种: 服务网格 (service mesh) 代理监控 Exporter(如 redis exporter)C…

【附源码】计算机毕业设计JAVA学校食堂订餐管理

【附源码】计算机毕业设计JAVA学校食堂订餐管理 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

Java#20(包和final)

目录 一.包 1.包的作用? 2.包名书写的规则? 3.什么是全类名? 4.什么时候需要导包? 什么时候不需要导包? 二.final 三.常量 实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性 四.权限修饰符 五.静态代码块 一.包 1…

简述使用vue使用webpack脚手架创建项目并升级至webpack4

第一步、输入命令 vue init webpack demo2 (demo2表示项目名称),回车后等待项目完成创建; 第二步、打开package.json,升级以下依赖(建议升级一项依赖后运行一下项目) webpack系列webpack 3.6.…

Vue实现下载及文件重命名

效果如下&#xff1a; 实现步骤&#xff1a; html&#xff1a; <el-table-column prop"name" label"操作" align"center" header-align"center" width"165"><template slot-scope"scope"><el-but…

MindSpore和Python中nn.Unfold的区别

在往MindSpore迁移项目中遇到了这个转换&#xff0c;以至于不得不去仔细研究一下。 Unfold是卷积操作中的一部分&#xff0c;我们来看一下描述。 Unfold()函数是从一个batch图片中&#xff0c;提取出滑动的局部区域块&#xff0c;也就是卷积操作中的提取kernel filter对应的滑…

图片如何加水印?教你几招轻松加

相信很多喜欢出门游玩的小伙伴&#xff0c;会习惯将旅途中遇到的风景、趣事将其拍照记录下来&#xff0c;然后将图片分享到社交账号上去&#xff0c;但是互联网上什么人都有&#xff0c;总会有不怀好意的人&#xff0c;会在网上拿别人辛苦拍摄的照片&#xff0c;据为己有去发布…

开放式运动耳机哪款好,盘点几款目前最好的开放式耳机分享

如果是在户外运动的时候喜欢戴耳机&#xff0c;那么必然是要选择骨传导耳机&#xff0c;开放式耳道的设计在跑步的过程中&#xff0c;可以很快察觉到来往行人车辆&#xff0c;在安全方面能够极大缩小隐患的发声&#xff0c;无需入耳的佩戴设计能够以最大程度的释放我们的耳道长…

[翻译] 使用FXGL创建一个简单游戏 Pong (FXGL 11)

在本文中&#xff0c;我们将复刻经典的Pong游戏。要完成本教程&#xff0c;你首先需要获取FXGL要么通过Maven / Gradle&#xff0c;要么作为uber-jar。确保你使用FXGL 11 (例如11.3)。 本教程大部分是独立的&#xff0c;但是完成以前的基本教程将对一般理解非常有帮助。完整的…

刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】

刷题日记【第十三篇】-笔试必刷题【数根星际密码跳台阶扩展问题快到碗里来】 1.方法区在JVM中也是一个非常重要的区域&#xff0c;它与堆一样&#xff0c;是被【线程共享】的区域。 下面有关JVM内存&#xff0c;说法错误的是&#xff1f;(c) A.程序计数器是一个比较小的内存区…

GO语言之Goroutine和channel

1&#xff0c;goroutine-看一个需求 需求&#xff1a;要求统计1-90000000000的数字中&#xff0c;哪些是素数哦&#xff1f; 分析思路&#xff1a; 1&#xff09;传统的方法&#xff0c;就是使用一个循环&#xff0c;循环的判断各个数是不是素数。 2&#xff09;使用并发或…

Metabase学习教程:提问-5

多级聚合 如何使用查询生成器对多个部分提出问题。 许多分析问题只需四个步骤即可回答&#xff1a; 连接需要的表得到需要的信息。过滤数据使其仅包含期望的记录。分组和聚合这些数据&#xff0c;创造你所需要的价值。可视化结果&#xff0c;方便直观的理解数据告诉了你什么…

SpringBoot 集成JWT实现登录认证

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 一、JWT简介 JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递…

基于粒子群优化算法的最佳方式设置无线传感器节点的位置,以减轻由于任何能量耗尽节点而产生的覆盖空洞(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

数据脱敏的安全管理

什么是数据脱敏 我们需要先说下什么是敏感数据&#xff0c; 敏感数据泛指个人信息&#xff08;姓名、电话、住址、健康信息、证件等数据&#xff09;、涉及需要保护的数据。 数据脱敏&#xff0c;是将敏感数据按照一定的规则对敏感数据进行变形&#xff0c;达到保护用户信息安…