1. 异常

1.1 JAVA语言如何进行异常处理

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。

在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。

当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。

1.2 关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally

一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防所有”异常”的程序。

紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。

throw语句用来明确地抛出一个”异常”。

throws用来标明一个成员函数可能抛出的各种”异常”。

Finally为确保一段代码不管发生什么”异常”都被执行一段代码。

可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。

每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。

如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。

2. Java的接口和C++的虚类的相同和不同处

由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。

与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。

当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public。

一个类可以实现多个接口。

3. abstract class和interface有什么区别?

3.1 抽象类

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。

不能创建abstract 类的实例。

然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。

不能有抽象构造函数或抽象静态方法。

Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。

取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

3.2 接口(interface)

是抽象类的变体。

在接口中,所有方法都是抽象的。

多继承性可通过实现这样的接口而获得。

接口中的所有方法都是抽象的,没有一个有程序体。

接口只可以定义static final成员变量。

接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。

由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

3.3 区别

  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现很多个接口,但是只能继承一个抽象类
  • 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

4.面向对象的特征有哪些方面

4.1 抽象

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。

抽象包括两个方面,一是过程抽象,二是数据抽象。

4.2 继承

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。

对象的一个新类可以从现有的类中派生,这个过程称为类继承。

  • 新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
  • 派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

4.3 封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。

面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

4.4 多态性

多态性是指允许不同类的对象对同一消息作出响应。

多态性包括参数化多态性和包含多态性。

多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

5.Comparable和Comparator接口的作用以及它们的区别

Java提供了只包含一个compareTo()方法的Comparable接口。

  • 这个方法可以个给两个对象排序。
  • 具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。

  • compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。
  • equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。
    • 只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

6. 泛型

6.1 介绍

泛型,即“参数化类型”。

一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。

那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

public class GenericTest {public static void main(String[] args) {/*List list = new ArrayList();list.add("qqyumidi");list.add("corn");list.add(100);*/List<String> list = new ArrayList<String>();list.add("qqyumidi");list.add("corn");//list.add(100);   // 1  提示编译错误for (int i = 0; i < list.size(); i++) {String name = list.get(i); // 2System.out.println("name:" + name);}}}

采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。

6.2 解释一下extends 和super 泛型限定符

6.2.1 泛型中上界和下界的定义

上界<? extend Fruit>

下界<? super Apple>

6.2.2 上界和下界的特点

上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)

下界的list只能add,不能get

6.2.3 示例代码

import java.util.ArrayList;
import java.util.List;class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}public class CovariantArrays {public static void main(String[] args) {//上界List<? extends Fruit> flistTop = new ArrayList<Apple>();flistTop.add(null);//add Fruit对象会报错//flist.add(new Fruit());Fruit fruit1 = flistTop.get(0);//下界List<? super Apple> flistBottem = new ArrayList<Apple>();flistBottem.add(new Apple());flistBottem.add(new Jonathan());//get Apple对象会报错//Apple apple = flistBottem.get(0);}
}

上界<? extend Fruit> ,表示所有继承Fruit的子类,但是具体是哪个子类,无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,不管追溯多少辈,肯定有个父类是Fruit,所以,我都可以用最大的父类Fruit接着,也就是把所有的子类向上转型为Fruit。

下界<? super Apple>,表示Apple的所有父类,包括Fruit,一直可以追溯到老祖宗Object 。那么当我add的时候,我不能add Apple的父类,因为不能确定List里面存放的到底是哪个父类。但是我可以add Apple及其子类。因为不管我的子类是什么类型,它都可以向上转型为Apple及其所有的父类甚至转型为Object 。但是当我get的时候,Apple的父类这么多,我用什么接着呢,除了Object,其他的都接不住。

所以,归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型。具体来讲,我可以把Apple对象赋值给Fruit的引用,但是如果把Fruit对象赋值给Apple的引用就必须得用cast。

面向对象回顾(异常(try、catch、throw、throws和finally)、接口和抽象类、面向对象特征、泛型(extends/super))相关推荐

  1. 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用~续(TestBase继承ITest是多余的?)...

    在我上一篇文章发表后,收到了很多博友的回复,其中有一位博友提了一个问题,TestBase 继承了ITest是多余的,我认为,我有必要再写一篇文章来说明一下,TestBase为什么要继承ITest,当然 ...

  2. 异常是catch还是throws的简单原则

    1 .如果你完全能处理这个异常,那么就catch掉 public void test() { try { } catch (Exception e) { } } 2. 如果你完全不能处理这个异常,那么 ...

  3. java事务异常 try catch throw new BusinessException

    今天找了一个之前小伙伴写的bug代码,大致内容如下: try {                 System.out.println("调用接口处理开始");           ...

  4. php object oriented,PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】...

    本文实例讲述了PHP面向对象(Object-oriented programming,OOP)基础.分享给大家供大家参考,具体如下: 我们可以使用接口(interface),指定某个类必须实现哪些方法 ...

  5. 浅谈Java throw, throws, try catch异常处理

    2019独角兽企业重金招聘Python工程师标准>>> 1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果 ...

  6. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  7. 异常机制及throw与throws的区别 (z)

    Java的异常处理 Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的:         Throws ...

  8. Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  9. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    最近的一个内部表决系统开发过程中, 发现对异常处理还存在一些模棱两可的地方, 所以想着整理一下 主要涉及到: 1.try catch finally throws throw 的使用和解读 2.自定义 ...

最新文章

  1. 按摩师-总预约时间最长
  2. 微服务领域,为什么选SpringCloud而不是Dubbo?
  3. 当产品上线前出了 Bug | 每日趣闻
  4. [APUE]文件和目录(中)
  5. 腾讯又双叒涨工资了!平均月薪已达7.27万?
  6. mysql性能优化学习_mysql学习——性能优化之sql优化
  7. fedora下一些问题的解决方案汇总
  8. 2021-08-02 INSERT INTO插入语句
  9. php递归函数的用法,PHP递归函数用法
  10. 华为鸿蒙系统卡顿怎么解决,为什么手机卡顿成系统难题?华为推出的鸿蒙系统有望解决...
  11. java itext5 插入一个艺术文字 (剪切蒙版)
  12. Github / Gitlab Actions 中的 cron 格式 和设置方法
  13. 海绵宝宝和派大星[三国演义姓名的重复]
  14. 矩阵的Kronecker积的相关结论
  15. react antd表格中渲染一张或多张图片
  16. awk命令详解(大全)
  17. 西南联大数字复原项目获国际论坛奖项 百度AI赋予历史温度
  18. 第一组 Alpha冲刺(1/3)
  19. 【转】金融业企业划型标准规定 银发〔2015〕309号
  20. python小小爬虫(一)—— 爬取学校官网通知(仅作为练习使用)

热门文章

  1. cookies和session
  2. iOS开发之pch文件的正确使用
  3. 使用xshell 登陆aws的ec2
  4. Android被逼学习例子2
  5. Banana PI 香蕉派项目
  6. 某android平板项目开发笔记--自定义sharepreference UI
  7. 解决vmware移动虚拟机之后执行ifconfig命令无输出的问题
  8. vue elementUI表单输入时触发事件@input
  9. 【网址收藏】Ubuntu使用OBS录制桌面时黑屏怎么办?
  10. Spark On K8S(Standalone模式部署)