黑马程序员 - 接口、内部类和异常
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
抽象类
特点:
1.方法只有声明没有实现时,该方法就是抽象类,需要用 abstract 修饰
2.抽象类不可以被实例化,因为调用抽象方法没意义
3.抽象类必须有其子类覆盖所用的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类
1.抽象类中有构造函数么?
有,虽然抽象类不能用 new 创建对象,不需要初始化,但是可以用于给子类进行初始化。
2.抽象类可以不定义抽象方法么?
可以,但很少见,目的就是//不让该类创建对象。
通常这种类中的方法有方法体,但是没有内容。
例:void show()
{}
3.抽象关键字不可以和那些关键字共存?
private 不行,因为 private 修饰的内容不能被子类覆盖
static 不行,
final 不行,因为 final 修饰的内容不能被子类覆盖
4.抽象类和一般类的异同
相同:
均用来描述事物,在内部定义成员。
不同点:
1.一般类不能定义抽象方法
抽象类可以定义抽象及非抽象方法。
2.一般类可以被实例化
抽象类不可以被实例化
抽象类演示:
abstract class Damo {abstract void show(); //抽象的函数 }class DemoA extends Dame {void show() //如果子类继承抽象类狗没有覆写抽象方法,该子类仍然为抽象类 {System.out.println("Hello DemoA"); } }class DemoB extends Demo {void show(){System.out.println("Hello DemoB");} }
抽象类的应用
雇员示例:
需求:公司程序员有姓名,工号,薪水,工作内容。
项目经理有。。。等,还有奖金。
分析:
想找出涉及的对象
程序员:
属性:姓名,工号,薪水
行为:工作
经理:
属性:姓名,工号,薪水,奖金
行为:工作
程序员与经理不存在直接继承关系,但是程序员与经理具有共性内容。
将程序员与经理进行抽取,建立体系
abstract class Employee //定义雇员 { private String name; //定义成员变量private String id;private int payment;Employee(String name,String id,int payment)//定义成员构造函数 {this.name = name ;this.id = id ;this.payment = payment ;}public abstract void work(); //定义抽象方法 }//描述程序员 class Programmer extends Employee //令程序员继承雇员 {Programmer(String name,String id,int payment) //定义程序员的构造方法 {super(name,id,payment);}void work() //此行覆盖父类中的抽象方法 {System.out.println("code..."); //定义程序员的特有方法 } } //描述项目经理 class Manager extends Employee //令项目经理继承雇员 {private int bonus; //定义成员变量Manager(String name,String id,int payment,int bonus) //定义项目经理的构造函数 {super(name,id,payment); //继承父类构造函数this.bonus = bonus ;}void work() //覆盖父类抽象方法 {System.out.println("manage..."); //定义项目经理特有方法 } }
当一个抽象内中的方法均为抽象时,可以将该抽象类用另一种形式定义和表示,就是接口 interface
此时,定义接口的关键字是 interface 而非 class
对于接口中的成员,均有固定的修饰符
1.全局常量 public static final (这些修饰符是固定的,即使没有写,程序也会自动添加。)
2.抽象方法 public abstract (这些修饰符是固定的,即使没有写,程序也会自动添加。)
由此可以看出,接口中成员都是公共权限。
interface InterfaceDemo {public static final int num = 4 ;abstract void show1();abstract void show2(); }
类与类之间是继承关系,接口与接口之间是继承关系(而且可以多继承),类与接口之间是实现关系此时关键字用 implements 。
接口不可以被实例化,只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实现化。
class DemoA implements InterfacceDemo // implements A,B就是多实现 {void show1(){//具体的实际的方法略 }void show2(){//具体的实际的方法略 } }
实现的好处是可以实现 多实现,一个类可以实现多个接口。
一个类在继承一个类的时候,还可以实现多个接口,接口的出现避免了单继承的局限性。
class Test extends C implements A,B
一个接口使用实例
笔记本电脑通过usb接口扩展u盘
interface USB //暴露接口规则 {public void open();public void close();public void work(); }class Upan implements USB //定义一个符合usb规则的upan {public void open(){System.out.println("upan open"); //定义具体的实现方法 }public void close(){System.out.println("upan close");}public void work(){System.out.println("upan work");} }class Laptop {public static void main(String[] args){useUSB(new Upan()); //创建一个upan,并通过定义的使用方法使用 }public static void useUSB(USB u) //定义一个使用usb的方法 {u.open();u.close();u.work();} }
运行结果:U盘正常运行
内部类的特点:
1.内部类可以直接访问外部类的成员。
2.外部类药访问内部类必须建立内部类的对象。
静态类中的成员,函数均为静态的。
内部类在局部位置在上只能访问局部中被final修饰的局部变量。
interface Demo {void show(); } class Outsider {private int num = 3 ;void method()//如无此行,内部类直接写在外部类中时,可用 Outsider.Intersider in2 = new Outsider().new Intersider(); //直接访问内部类中的内容,记格式。 {final int a = 4 ; //在内部类中访问局部变量时,必须在变量前加finalclass Intersider{int num = 5 ;void show(){System.out.println("num="+num);System.out.println("num="+Outsider.this.num); //此时输出的是外部的num = 3. 仅内部类与外部类出现重名变量的时候才这样使用。System.out.println("a="+a); //要访问a这局部变量,必须在变量前加 final }}Intersider in1 = new Intersider();in1.show();System.out.println();} //以下为演示匿名内部类public void method0(){new Demo() //此时Demo是抽象类,不能直接创建对象,但此时已经在其中具体了其抽象方法的具体实现,所以这步实际上是创建了一个Demo的子类的对象{ //这种方法是创建了一个子类,所以可以在其中添加子类特有的方法,例如 show2()public void show() //public 必须加上(重要) {System.out.println("匿名内部类01");}}.show(); //.show()很重要,和普通一样,表示使用。 Demo in = new Demo() //这种方法创建的子类,自动向上转型成为了Demo类,所以不可以添加子类特有的方法,仅可以复写Demo中已有的方法。 {public void show() //public 必须加上(重要) {System.out.println("匿名内部类02");}}; // ; 很重要 in.show();} }class Neibulei {public static void main(String[] args) {Outsider Out = new Outsider();Out.method();new Outsider().method(); //此方法为用匿名类new Outsider().method0();} }
异常类
注意:如果让一个类成为异常类,必须继承异常体系,因为只有成为异常类才能被关键字 throws throw
异常的分类:
1:编译时被检测异常,主要是Exception 和 其子类(除 RuntimeException)
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式
这种问题都可以针对性的处理。
2:编译时不检测异常(运行时异常):就是RuntimeException 及 其子类。
这种问题发生,无法让功能继续,大多是因为调用者的原因导致
这种问题一般不处理,直接编译通过,在运行时,让调用哪个最调用时的程序强制停止,让调用者对代码进行修正
异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式。
具体格式:
try {//需要被检测异常的代码 } catch(异常类 变量)//该变量用于接收发生的异常对象 {//处理异常的代码。 } finally //通常用于关闭(释放)资源 {//一定会被执行的代码。 }
异常处理原则
1:函数内部如果抛出需要检测的异常,那么函数上必须要添加声明,或者必须在函数内用try catch捕捉,否则编译失败。
2:功能内容可以解决,用catch
解决不了,用throws告诉调用者,由调用者解决。
3:一个功能如果抛出 多个异常,那么调试时,必须有对应多个catch进行针对性的处理。
抛出几个,就catch几个。
异常应用演示
class Fushuindex extends RuntimeException //继承的Exception时,需要throws Fushuindex (添加捕捉自定义声明) {Fushuindex(String a){super(a); //直接调用父类的方法 } } class Demo {public int method(int [] arr , int index) //继承的Exception时,需要throws Fushuindex (添加捕捉自定义声明) {if(arr==null)throw new NullPointerException("数组的角标不能为空");if(index >=arr.length) //判断问题throw new ArrayIndexOutOfBoundsException("数组角标越界了: "+index); //自定义异常返回信息else if(index < 0)throw new Fushuindex("数组角标不能小于0: ");elsereturn arr[index];} } class ExceptionDemo {public static void main(String[] args) //继承的Exception时,需要throws Fushuindex (添加捕捉自定义声明) {int [] a = new int [3];Demo d = new Demo();int num1 = d.method(a,1);System.out.println("Hello World!"+num1); //以下演示异常捕捉 //多catch 时,父类catch必须放在最下面try{int num2 = d.method(a,-30);System.out.println("num2 = "+num2);}catch (Fushuindex x){System.out.println("负数角标异常");System.out.println(x.toString()); //异常信息 }catch (Exception e){}System.out.println("over");} }
转载于:https://www.cnblogs.com/myblog-cl/p/4748795.html
黑马程序员 - 接口、内部类和异常相关推荐
- 黑马程序员 java中关于异常的学习日志
-------------------android培训. java培训.期待与您交流!------------------- java中异常的总结 首先,什么是异常呢?简而言之,异常是对问题的描述, ...
- 黑马程序员_异常(老毕视频总结及《疯狂java》补充)
----------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+A ...
- 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)
黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...
- 黑马程序员入学Java知识——精华总结
黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
- 黑马程序员训练营十道满分题解
黑马程序员训练营基础测试题十道 代码下载见GitHubs:https://github.com/fairyxingyun/Itheima_exam_10_answer 1. 编写一个函数,函数内输出一 ...
- 黑马程序员——总集篇
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 本人编写技术博客的时候只是针对章节的一些比较重要的知识点来编写的: 个人感觉质量 ...
- 黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结
黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日 day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合 ...
- 最近整理的一些常见的面试题,面试大全,黑马程序员面试宝典题库---最新技术--篇
第八章 最新技术(评论区留言获取原件) 一. Redis 1. Redis 的特点? Redis 是由意大利人 Salvatore Sanfilippo(网名: antirez)开发的一款内存高速缓存 ...
最新文章
- pytorch_lightning Default process group is not initialized
- JavaScript 读取CSV文件并转为js对象
- outlook反应慢的原因_环氧漆不固化是什么原因?固化剂的使用有关系!
- 设计模式中的那些工厂
- AWS 专家教你使用 Spring Boot 和 DJL ,轻松搭建企业级机器学习微服务!
- r语言 回归分析 分类变量_R语言下的PSM分析分类变量处理与分析步骤
- 【HISI系列】之IP/MAC地址配置
- 消费者性别及其所偏好牛奶品牌频数分布
- 批量删除redis key
- 清华大学操作系统OS学习(四)——物理内存管理:连续内存分配
- Altium中Smart PDF的使用
- 计算机局域网地址设置方法,怎么设置局域网电脑的ip地址和DNS?
- 格斗系统 - Universe Fighting Engine
- algodoo是什么意思_洋是什么意思 带洋字的男孩名字 用洋字起名的寓意
- 裸金属服务器能降级虚拟机不,裸金属服务器属于虚拟机吗
- C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
- 利用程序设置你的国庆专属头像
- Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理
- 微信机器人-定制消息
- android在线音乐播放器教程,android实现简单音乐播放器
热门文章
- Druid 执行时间分布规则
- mysql的端点在哪查看_数据库镜像端点
- 网络宣传推广浅谈关键词排名好却没有流量的原因解决方法!
- 产品网络推广方案之有哪些方法可以更好地优化404页面?
- css 引用otf文件,CSS-如何将OTF / TTF文件转换为EOT格式?
- rs485调试软件_5种RS485切换方向的方法及优劣势分析
- 计算机电缆外径相差太大,DJYPVP计算机电缆标准外径
- linux cp命令逻辑,Linux-CP命令
- 开发日记-20190701 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 7
- AngularJS中ng-repeat对象的问题