多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

多态的概念:

  • 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。
  • 多态存在的三个必要条件: 需要存在继承或实现关系 同样的方法调用而执行不同的操作、运行不同代码(重写) 在运行时父类或者接口的引用变量可以引用其子类的对象。
  • 多态的作用: 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离。 多态消除了类型之间的耦合关系 多态的存在提高了程序的拓展性和后期的可维护性。
abstract class Animal
{abstract void eat();
}
class dog extends Animal
{void eat(){System.out.println("狗啃骨头");}
}
class cat extends Animal
{void eat(){System.out.println("猫吃鱼");}
}
public class Main {public static void main(String[] args) {Animal an1=new dog();//在运行时父类或者接口的引用变量可以引用其子类的对象。向上转型Animal an2=new cat();an1.eat();an2.eat();}
}

对象的上下转型:

  • 由子类转换父类,在继承图上是向上移动的,一般称为向上转型
  • 向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
  • 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
  • 与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
  • instanceof运算符用来在运行时通过返回值来指出对象是否有特定类或者它的子类的一个实例。典型使用场合:在对对象做下转型之前,没有其他有关对象信息时务必使用instanceof来判断一下,以避免抛出ClassCastException异常。用法如下:
result=object instanceof class
result:布尔类型
object:必选项,任意对象表达式
class:必选项,任意已定义的对象类
说明:如果object是class或其子类的一个实例(引用),则instance运算符返回true如果不是或者object是null,则返回false
  • 对象的上下转型举例:
abstract class Animal
{abstract void eat();
}
class dog extends Animal
{void eat(){System.out.println("狗啃骨头");}void sleep(){System.out.println("狗狗睡觉");}
}
class cat extends Animal
{void eat(){System.out.println("猫吃鱼");}
}
public class Main {public static void main(String[] args) {Animal an1=new dog();//在运行时父类或者接口的引用变量可以引用其子类的对象。Animal an2=new cat();an1.eat();//an1.sleep();向上转型过程中,类接口中唯一可能发生的事情是丢失方法。这里就无法调用sleep方法//我感觉这里是因为父类没有该方法,而子类有这个方法,所以这个方法会丢失。an2.eat();//cat cat1=(cat)an1;这样强制向下转型会抛出异常if(an1 instanceof cat){System.out.println("可以转型");cat cat1=(cat)an1;//在这里并没有输出,因为an1并不是cat或其子类的一个实例(引用),}if(an2 instanceof cat){System.out.println("可以转型");cat cat1=(cat)an2;//在这里有输出,因为an2是cat的一个实例}}
}
  • 不使用多态代码示例:
class School
{CaiSeDaYinJi c1;HeiBaiDaYinJi h1;void AnzhuangDaYinJi(CaiSeDaYinJi c1){this.c1=c1;}void AnzhuangDaYinJi(HeiBaiDaYinJi h1){this.h1=h1;}void ShiYongCaiSeDaYinJi(String context){c1.print(context);}void ShiYongHeiBaiDaYinJi(String context){h1.print(context);}
}
abstract class DaYinJi
{String name;public DaYinJi(String name) {this.name=name;}abstract void print(String context);
}
class CaiSeDaYinJi extends DaYinJi
{public CaiSeDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"彩色打印:"+context);}
}
class HeiBaiDaYinJi extends DaYinJi
{public HeiBaiDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"黑白打印:"+context);}	
}
public class Main {public static void main(String[] args) {CaiSeDaYinJi c1=new CaiSeDaYinJi("惠普1");HeiBaiDaYinJi h1=new HeiBaiDaYinJi("惠普2");School s=new School();s.AnzhuangDaYinJi(c1);s.AnzhuangDaYinJi(h1);s.ShiYongCaiSeDaYinJi("使用彩色打印打印");s.ShiYongHeiBaiDaYinJi("使用黑白打印打印");	}}
  • 将上述代码改为多态的形式进行编写,方便代码功能的添加使代码耦合性更强。
class School
{DaYinJi d1;void AnzhuangDaYinJi(DaYinJi d1){this.d1=d1;}void ShiYongDaYinJi(String context){d1.print(context);}
}
abstract class DaYinJi
{String name;public DaYinJi(String name) {this.name=name;}abstract void print(String context);
}
class CaiSeDaYinJi extends DaYinJi
{public CaiSeDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"彩色打印:"+context);}}
class HeiBaiDaYinJi extends DaYinJi
{public HeiBaiDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"黑白打印:"+context);}	
}
public class Main {public static void main(String[] args) {CaiSeDaYinJi c1=new CaiSeDaYinJi("惠普1");HeiBaiDaYinJi h1=new HeiBaiDaYinJi("惠普2");School s=new School();s.AnzhuangDaYinJi(c1);s.ShiYongDaYinJi("使用彩色打印");s.AnzhuangDaYinJi(h1);s.ShiYongDaYinJi("使用黑白打印");}
}

异常:

  • 异常概念、异常分类、java异常处理机制、try…catch…finally、throw和throws、自定义异常

异常的概念:

  • 什么是异常? 所谓的异常是指在程序运行的过程中发生的一些不正常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。
  • 异常导致的后果? java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交给java运行时系统,这个过程称为抛出异常,不处理的话会直接导致程序直接中断。
  • 如何防止程序中断? 设计良好的程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
  • java异常的分类:分为errorExceptionerror: 这个异常时系统运行java虚拟机的异常,和代码没有关系,这种异常我们一般处理不了,基本上都是要去检查操作系统和检查运行环境。Exception: 这个异常我们能够处理,分为IOExceptionRuntimeException
  • 除了上面的异常分类之外我们还将异常分为以下类别:
异常类型包括来源处理
受检查异常(checkException)Exception及其子类(不包括RuntimeException)由代码控制能力之外的因素导致的运行时错误必须要处理,否则通不过编译
非受查异常(uncheckedException)Error和RuntimeException及其子类RuntimeException一般代表编程错误可以不用处理
  • 受检查异常: 比如说:去读取磁盘上某个文件,文件不存在或者要连接某个服务器而连不上,因为这些原因产生的异常就要处理,否则程序可能会运行到一半时崩了。
  • 非受查异常: 比如说:java虚拟机运行时的异常或者程序代码里面类似除数等于0这样的异常或者多态处理上下转型时的异常,这些都是编程时由于代码问题而导致的编程错误,这种异常可以不用处理。
  • java异常处理机制: Try-catch-finally, try: 监控区域,执行可能产生异常的代码。catch: 捕获、处理异常。finally: 善后处理,无论是否发生异常,代码总能执行。try{}语句块中放的代码是要检测的java代码,可能会抛出异常,也可能会正常执行。catch(异常类型){}块是当java运行时系统接收到try块中所抛出异常对象时,会寻找能处理这一异常catch块来进行处理(可能有多个catch块)。finally{}不管系统有没有抛出异常都会去执行,除了在之前执行了System.exit(0);一般用来释放资源。这几部分代码块里面的代码变量是不相关的,相当于局部变量吧。
  • Java里try catch的简单用法: ①try+catch: 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理。然后执行catch块后面的语句。②try+catch+finally: 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句。③try+finally: 程序的流程是:运行到try块中,如果有异常抛出的话,程序转向执行finally块的代码。那末finally块后面的代码还会被执行吗?不会!因为没有处理异常,所以遇到异常后,执行完finally后,方法就已抛出异常的方式退出了。
  • 下面是java异常处理的示例代码:
import java.util.Scanner;
class Person
{String name;
}
public class Main {public static void main(String[] args) {int a=10;int b;int c;Scanner sc=new Scanner(System.in);Person p=null;System.err.println("请输入除数:");b=sc.nextInt();try{c=a/b;p.name="FHN";}catch(Exception e){ //Exception e这个是捕获所有的异常,有了这句就不用写下面的catch了System.out.println("空指针异常,请检查有没有初始化指针!");}
//		catch(NullPointerException e){
//			System.out.println("空指针异常,请检查有没有初始化指针!");
//		}
//		catch(ArithmeticException e){
//			System.out.println("除数为0,请检查输入的除数,重新输入!");
//			b=sc.nextInt();
//			c=a/b;
//			System.out.println("c="+c);
//		}finally{System.out.println("end");}System.out.println("end2");//如果在只用try和finally,在有异常时不会执行到这句,程序在这句之前就退出了}
}

throw和throws:

  • throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常。
  • throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理。
  • 两者区别: throw用在方法内,后面跟上要抛出的异常类对象。throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出异常类名。 throw:手动抛出异常。throws:声明方法可能要抛出异常。
  • 代码示例:
class Bar
{int age;public Bar(int age) {this.age=age;}void check ()throws IllegalArgumentException //throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出异常类名。{if(age<18){throw new IllegalArgumentException("年纪太小");//年纪太小,会在异常抛出时显示}}
}
public class Main {public static void main(String[] args) {Bar b=new Bar(15);try{b.check();}catch(IllegalArgumentException e){System.out.println(e.getMessage());e.printStackTrace();//显示异常的数据}System.out.println("end");}
}

自定义异常:

  • 常见异常:RuntimeException、IOException、SQLException、ClassNotFoundException
  • 自定义异常: java提供的异常体系不可能遇见所有加以报告的错误
  • 自定义异常类必须从已由的异常类继承。 建立新的异常类型最简单的方法就是让编译器产生默认构造方法。 对于异常来说,最重要的部分就是它的类名。 可以为异常类定义一个接受字符串参数的构造方法,字符串参数描述异常信息。
  • 下面是使用自己定义的异常类,来手动抛出异常的代码:
class Bar
{int age;public Bar(int age) {this.age=age;}void check ()throws AgeLess //throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出异常类名。{if(age<18){throw new AgeLess("年纪太小");//年纪太小,会在异常抛出时显示}}
}
class AgeLess extends Exception //AgeLesss是自己定义的异常类,继承自Exception,是首查异常
{private String message;public AgeLess(String message) {this.message=message;}public String getMessage() { //重写了父类的getMessagereturn this.message;}
}
public class Main {public static void main(String[] args) {Bar b=new Bar(15);try{b.check();}catch(AgeLess e){System.out.println(e.getMessage());e.printStackTrace();//显示异常的详细数据,这里是父类的方法}		System.out.println("end");}
}

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

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

相关文章

tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式

前言Tomcat是一个非常流行的Web服务器&#xff0c;用于部署和运行Java Web应用程序。一般情况下&#xff0c;我们都是在单独的Tomcat实例上运行自己的Web应用&#xff0c;其实与这种经典方案相比&#xff0c;我们可以将服务器运行时直接集成到应用程序中&#xff0c;从而更加的…

Linux用户组笔记整理

目录 一、Linux用户组概念 二、常用命令 三、用户组信息存储位置 一、Linux用户组概念 Linux用户组&#xff08;group&#xff09;就是具有相同操作权限范围的Linux用户管理起来&#xff1b; 比如有时我们要让同一类用户具有相同的权限&#xff0c;比如查看、修改某一文件或执…

java泛型、泛型类及特点、限制泛型、类型通配符声明、泛型方法

java泛型&#xff1a; 泛型简介泛型类限制泛型可用类型类型通配声明泛型方法 问题&#xff1a; 如果我们需要产生多个对象&#xff0c;每个对象的逻辑完全一样&#xff0c;只是对象内的成员变量的类型不同。那我们该如何去做&#xff1f;如果按照正常的做法就要创建多个类文件…

不生效 设置了viewport_配置viewport

最近项目中需要开发内嵌的H5页面&#xff0c;viewport不是很熟悉&#xff0c;故来翻译一下此篇文件加深理解原文配置viewportIOS上的safari使用一种缩放的工作模式来展示pc端的网页&#xff0c;如果默认的设置对你的网页展示不友好&#xff0c;推荐你改变veiwport默认配置&…

Linux文件操作实用笔记

Linux系统遵循一切皆是操作文件的规则。所以想用好Linux系统&#xff0c;就必须要掌握文件相关的操作。 1、创建文件命令&#xff1a;touch 语法格式&#xff1a; touch filename #filename 文件名称。 比如 touch hello.txt就会在当前木创建一个hello.txt的文件。 说明&#x…

安装完CentOS 7 后必做的七件事

CentOS是最多人用来运行服务器的 Linux 版本&#xff0c;最新版本是 CentOS 7。当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后&#xff0c;首要的工作肯定是加强它的安全性&#xff0c;以下列出的七件事&#xff0c;是你进一步配置系统和安装其他软件前必须做的。 1. 更改…

python显示小数点后几位数_python窗口编程-3:数位处理(整数)

我们在上一次课程中(python窗口编程-2&#xff1a;风格与布局 )&#xff0c;制作了完整的计算器窗口界面&#xff0c;只是那个窗口没有真正的功能&#xff0c;是点击任何按钮都会关闭。这一次&#xff0c;我们加入一些事件处理的功能&#xff0c;让它成为一个正常工作的窗口程序…

Linux文件目录基础笔记

1、进入目录名称&#xff1a;cdcd命令主要是方便用户切换到不同目录的指令。比如&#xff1a;cd #只执行cd命令默认进入root的根目录cd /home #进入home目录&#xff0c;如果home目录有testdir目录的话&#xff0c;可以执行 cd testdir 进入testdir目录。2、创建目录命令&#…

eclipse安卓工程的构建、配置连接模拟器、安卓工程结构介绍

安卓工程构建及第一个安卓程序运行&#xff1a; 首先新建安卓工程&#xff1a; 然后填写APP信息&#xff0c;下面的包名一般都是公司域名的倒写&#xff0c;包名中不能有中文&#xff0c;否则会报错。 然后配置一些安卓app的选项 有关app启动的图标&#xff08;就像QQ的企鹅一…

android eclipse 导入idea项目

将以下代码复制到.project中 <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>IDEATest</name> <comment/> <projects/> <buildSpec> <buildCommand> <name>com.android.ide.…

Linux中su和sudo的用法整理

一、为什么会有su和sudo命令&#xff1f;主要是因为在实际工作当中需要在Linux不同用户之间进行切换。root用户权限最高很多时候需要root用户才能执行一些关键命令。所以需要临时切换为root用户。工作完成后&#xff0c;考虑到系统的安全性避免误操作需要切换为普通用户。su和s…

codeforces 650B - Image Preview

题意&#xff1a;给你n个照片&#xff0c;从第一个照片开始看&#xff0c;如果一张照片是w&#xff0c;那么要花费b时间去反转他&#xff0c;否则不用反转&#xff0c;看一张从来没看过的照片要1时间&#xff0c; 从一张滑动到另一张要a时间。如果一张照片看过&#xff0c;则不…

asp js单步调试_如何使用Chrome的控制台高效的调试Javascript代码?

引言在我们的日常开发中我们常常会遇到JavaScript的调试问题&#xff0c;而我们解决问题的传统解决方案就是使用大量的console.log或者console对象的其他方法&#xff0c;这会给我们带来很多不便&#xff0c;特别是遇到复杂问题的时候&#xff0c;可能会出现大量的console.log&…

安卓App的启动过程、安卓布局分类及布局和页面的关系

Android App 启动流程: 当你想要启动一个app时&#xff0c;首先得点击该app桌面图标。那点击图标时到底发生了什么呢&#xff1f;先看个理论知识 .Launcher: launcher其实就是一个app&#xff0c;从功能上说&#xff0c;是对手机上其他app的一个管理和启动&#xff0c;从代码…

Linux文件默认权限和umask笔记

关于Linux文件默认权限的问题&#xff0c;可以实际先尝试一下如下命令&#xff1a;root用户登录[rootlocalhost test]# touch file1[rootlocalhost test]# ls-l file1-rw-r--r-- 1 root root 0 May 5 08:28 file1 #输出结果 对应的数字权限 644[rootlocalhost test]# touch fi…

Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

RelativeLayout中子控件常用属性&#xff1a; 子控件默认是从父控件的左上角开始排列的 相对于父控件 android:layout_alignParentTop"true" 和父控件的顶部对齐android:layout_alignParentBottom"true" 和父控件的底部对齐android:layout_alignPar…