- 浏览: 72803 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
须等待:
强烈同意。。。。这个编辑器简直太不好用了!
对于在Ubuntu下的Eclipse上安装SVN客户端插件Subclipse的补充 -
nudtgk2000:
flysnail 写道 思路挺好,
谢谢鼓励,还是初学者,不 ...
重写CountDownLatch以实现线程状态监视 -
flysnail:
思路挺好,:)
重写CountDownLatch以实现线程状态监视
抽象类
- 关键字abstract
- 含有抽象方法的类必须声明为抽象类;
- 抽象类必须先被继承,不能直接实例化;
- 抽象方法只需声明不需实现,所以必须在子类中被重写(类似C++中的纯虚函数)
abstract class A { ... public abstract void b(); // note: 这里没有“{}”了 ... }
- 如果并不打算由抽象类的子类来实现抽象方法,可以将该子类再声明为抽象类,在其中再次声明该抽象方法,由他的子类(“孙子类”)去实现。
final关键字
- final变量的值不能修改(相当于C++的const关键字,当常量用);
- final成员变量
- final局部变量(形参):用在引用型形参上就能防止形参指向别处造成的bug
- final方法不能被重写;
- final类不能被继承(如JDK中的String、Math、Boolean等就是final类)。
接口interface
- java本来是单继承的;
- 接口interface是抽象方法和常量值的定义的集合;
- 从本质上讲,interface是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现(这个工作交给其实现类来完成);
public interface Runner { public static final int id = 1; // 常量前要加“public static final”关键字 public void start(); // interface内的抽象方法不需要加abstract关键字 public void run(); public void stop(); }
接口特性
- 接口支持多重实现;
- 多个无关的的类可以实现同一个接口;
- 一个类可以实现多个无关的接口;
- 接口中声明的属性默认且必须是public static final的;
这是为了避免像C++多继承那样多个父类有同名成员变量而出现的冲突。
- 接口中只能定义抽象方法,而这些方法默认且只能是public的;
- 接口可以继承其他接口,并添加新的属性和抽象方法。
- 与继承关系类似,接口与实现类之间存在多态性。
以接口引用实现类的对象,就只能调用本接口声明了的方法和属性。
定义JAVA类的语法格式:
<modifier> class <name> [extends <superclass>] [implements <interface> [, <interface>]*] { <declarations>* }
面向对象Summary
- 内存分析贯穿始终
- 对象和类的概念
- 类(对象)之间的关系
- 面向对象设计思想
- class
- new
- 引用的概念
- 构造方法的概念
- 方法重载
- 构造方法重载
- this
- static
- package 和 import
- private, default, protected, public
- extends
- overwrite重写
- final
- Object
- toString()
- equals()
- upcasting, downcasting
- polymophysm / dynamic binding / late binding
- abstract
- interface
- implements
异常exceptions
java异常概念
- 运行期出现的错误
- 观察错误的名字和行号最重要
程序,是调出来的。
- 异常是java提供的用于处理程序中错误的一种机制。
- 错误是指在程序运行过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在 等);
public class TestEx { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[4]); // 与Java不同,在C/C++中并不检查数组越界 } } /* 输出: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 at TestEx.main(TestEx.java:6) */
- 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的错误;
- java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该对象封装了异常事件的信息并将被提交给java Runtime系统,这个过程称为抛出(throw)异常;
- 当Java runtime系统收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
异常的分类
- 异常类封装了异常事件发生的信息以及相应方法。
- Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理(也处理不了)。
- Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式地声明或捕获。
- RuntimeException:一类特殊的异常,如被0除、数组下标出界等,其产生比较频繁,处理麻烦,如果显式地声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交由缺省的异常处理程序(可不必处理),不过缺省处理程序是打印异常信息后就中止执行了。
- java.lang.Exception
- ClassNotFundException
- IOException
- InterruptedException
- ......
- RuntimeException
- ArithmeticException
- NullPointerException
- ......
- IndexOutOfBoundsException
- ArrayIndexOutOfBoundsException
- StringIndexOutOfBoundsException
import java.io.*; public class TestEx { public static void main(String[] args) { TestEx te = new TestEx(); te.m(0); // 对RuntimeException不做处理有虚拟机缺省处理,编译可以通过,但运行时缺省处理报异常后就停止不往下执行了 // te.n(0); // 而对非RuntimeException必须try/catch或声明,否则编译报错 /* 编译报错 TestEx.java:27: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明以便抛出 te.n(0); ^ */ try { te.n(0); } catch(IOException e) { // 将try{}中抛出的某错误类的对象捕获传给引用e System.out.println("出错了!"); e.printStackTrace(); // 跟踪异常事件发生时执行堆栈的内容,并在控制台上打印出来,包含了getMessage()。 } /* 输出: 出错了! java.io.IOException: 而对非RuntimeException必须try/catch或声明,否则编译报错 at TestEx.n(TestEx.java:39) at TestEx.main(TestEx.java:22) 程序执行完毕 */ System.out.println("程序执行完毕"); } // 方法内创建异常类对象并抛出,注意语法 void m(int i) throws RuntimeException { // throws--声明异常 if(0 == i) throw new RuntimeException("对RuntimeException不做处理有虚拟机缺省处理,编译可以通过,但运行时缺省处理报异常后就停止不往下执行了"); } // note:如果throw语句后面方法内还有语句,当抛出异常时该方法内剩余的语句就不执行了 void n(int i) throws IOException { // IOException不属于RuntimeException if(0 == i) throw new IOException("而对非RuntimeException必须try/catch或声明,否则编译报错"); } }
异常的捕获和处理
-
try {}
- try代码段指定了一次捕获并处理例外的范围;
- 在执行过程中,该段代码可能会产生并抛出一种或多种类型的异常对象,那么它后面的catch语句要分别对它们做相应的处理;
- 若没有例外产生,所有的catch段都被跳过。
-
catch(SomeException e) {}
- SomeException e 封装了异常事件发生的信息,在catch段中可以使用该对象的一些方法获取这些信息。如:
- getMessage(),用来得到有关异常事件的信息;
- printStackTrace(),用来跟踪异常事件发生时执行堆栈的内容,包含了getMessage(),因此它更常用。
- 禁止空catch段,这是很危险的。
- note: 当捕获多类异常对象分别处理时,要将子类异常放在前面,否则编译报错“已捕捉到异常”。
- SomeException e 封装了异常事件发生的信息,在catch段中可以使用该对象的一些方法获取这些信息。如:
-
finally {}
- finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序其他部分前,能够对程序的状态做统一的管理;
- 无论是否有例外,finally段中代码都要执行;
- 可以用来完成资源的清理工作,如:
- 关闭打开的文件;
- 删除临时文件
- ... ...
import java.io.*; public class TestEx { public static void main(String[] args) { // 用try/catch结构体捕捉处理异常,之后程序会继续往下执行,注意语法 FileInputStream is = null; try { // try代码段包含可能产生异常的代码,注意!最小包含原则 is = new FileInputStream("myfile.txt"); int b; b = is.read(); while (b != 1) { System.out.print((char) b); b = is.read(); } // 当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch段 } catch(FileNotFoundException e) { // catch代码段声明其能处理的某一类异常 e.printStackTrace(); // 并在段内提供处理的方法 } catch(IOException e) { // 对try中抛出的多类异常,分别catch处理 System.out.println(e.getMessage()); // getMessage()方法用来得到异常事件的信息。较少用 } finally { // finally段的代码无论是否发生异常都要执行 try { is.close(); } catch(Exception e) { e.printStackTrace(); } } System.out.println("程序执行完毕"); } }
-
声明方法抛出的异常——“矛盾上交”
- 若在本方法内处理不了,可以再throws交给外一层处理。
import java.io.*; public class TestEx { public static void main(String[] args) { TestEx te = new TestEx(); // f()方法抛出的异常最终"上交"给main()方法处理了 // 当然main()方法也可以向外声明(throws)上交给虚拟机处理,但这是错误的 // 应当尽力将异常处理在自家门里 try { te.ff(); } catch(IOException e) { System.out.println("f()方法抛出的异常最后\"上交\"给main()方法处理了"); e.printStackTrace(); } } // 声明方法抛出的异常 void f(boolean b) throws FileNotFoundException, IOException { // 尽管FileNotFoundException是IOException的子类,可以只throws IOException,但作为一种意识还是强烈建议分开抛 if(b) throw new FileNotFoundException("声明方法抛出的异常A"); else throw new IOException("声明方法抛出的异常B"); } void ff() throws IOException { // 对调用的方法所抛出的异常处理不了的也可以继续向外抛出 f(true); } }
使用自定义的异常
通过继承 java.lang.Exception(或RuntimeException) 类声明自己的异常类;然后用法跟普通异常一样。
class MyException extends Exception { private int id; public MyException(String message, int id) { super(message); this.id = id; } public int getId() { return id; } }
声明了异常的类的继承重写
note:重写方法只能抛出与原方法所抛出一样类型(不包括父类、子类)的异常,要么不抛出异常。
异常Summary
- 一个图
- 五个关键字:try,catch,finally,throw,throws
- 先逮小的,再逮大的
- 异常和重写的关系
发表评论
-
Weka 3.6.9 加载libsvm类包的正解
2014-05-24 10:59 5928Weka 3.6.9本身不带libsvm的类包,百度网上铺天 ... -
【转】常用的系统属性
2012-11-21 17:02 785获取类文件所在的绝对路径 写道 "Jav ... -
用Log4j实现线程独立日志
2012-11-04 22:53 8204需求: 在一个项目里,我使用Log4j生成日志, ... -
重写CountDownLatch以实现线程状态监视
2012-11-04 20:25 1511需求:管理线程需要及时知道工作线程全部处于等待状态,并满足等待 ... -
byte型检查
2012-09-09 21:14 803byte b; //... ... // 范围检查,确保只 ... -
【转】Dom4j的使用(全而好的文章)
2012-08-07 15:09 942java解析xml汇总, 结论就是Dom4j比其他几种好 ... -
【转】正则表达式的一些资料
2012-08-07 15:07 849JAVA 正则表达式 (超详细)http://blog.csd ... -
【转摘】Exception in thread "main" java.lang.OutOfMemoryError: Java heap space解决方法
2012-08-04 18:02 14931摘自http://hi.baidu.com/61919 ... -
【转】java解析xml汇总
2012-07-31 20:53 16java解析xml汇总 -
java.io.InputStream.mark(int readlimit) 方法的个人理解
2012-05-16 16:04 0在马士兵java课程的IO这一章[1]中遇到 java.io ... -
马士兵课程笔记(续7) —— 流
2012-03-20 18:51 0Java 流式输入/输出原理 ... -
马士兵课程笔记(续6)
2012-03-18 18:31 1258容器 概念 Java API 所提供的用于在程序中 ... -
走了一段值得的弯路
2012-03-16 21:27 1047class C { int i; S ... -
马士兵课程笔记(续5)
2012-03-09 19:28 1448常用类 字符串相关类(String, StringBuff ... -
马士兵课程笔记(续4)
2012-02-28 21:58 1129数组 数组可以看成是多个相同类型数据组合,对这些数据的统一 ... -
马士兵课程笔记(续2)
2012-01-03 15:50 1140J2SDK中主要的包介绍 位置%JAVAHOME%\jr ... -
马士兵课程笔记
2011-11-14 07:47 1264J2EE框架 EJB (Enterprise Ja ... -
Porter Stemmer 波特词干算法
2011-10-26 08:17 6768/* Porter ... -
Linux命令收集罐
2011-10-23 16:54 920查看系统进程——ps 要对 ... -
JAVA中 @Override 的作用(转)
2011-10-22 22:44 2566<!-- @pa ...
相关推荐
【标题】"马士兵课程笔记(续5)"主要聚焦在编程和软件开发的某一特定领域,结合了“源码”和“工具”的概念。这可能是关于解析、分析或利用源代码,以及使用特定工具来提升开发效率或理解复杂系统的主题。马士兵是一...
【标题】"马士兵课程笔记(续4)"主要聚焦于编程知识,特别是通过代码实例来深化理解。马士兵是一位知名的IT教育专家,他的课程通常涵盖了广泛的编程主题,旨在帮助学员深入掌握技术。在这个部分,他可能继续讲解了...
### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...
马士兵JAVA笔记(全) 本资源是马士兵的JAVA笔记,涵盖了JAVA语言的基础知识,包括标识符、常量、变量、数据类型、运算符、控制流语句等。 标识符是JAVA中的一种符号,用于命名变量、方法、类等。标识符由字母、...
马士兵oracle笔记,浅显易懂。
jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识
Spring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).doc
马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...
马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...
马士兵课程源码11111111111111111111
马士兵Spring课堂笔记(超级详细版) 本资源主要讲解了Spring框架的基础概念和应用,涵盖了面向接口编程、IOC/DI、AOP、Spring应用IOC/DI、Spring应用AOP、Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合、Spring...
以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...
马士兵Spring课堂笔记(详细版) 马士兵spring视频笔记
### 马士兵Hibernate学习笔记知识点总结 #### 一、课程内容概览 - **HelloWorld**:通过简单的示例程序介绍如何启动一个基于Hibernate的Java项目。 - **Hibernate原理模拟**:解释O/R Mapping的概念及其重要性。 -...
JAVA就业班笔记【马士兵说】.nyf
《马士兵Hibernate学习笔记》是一份详尽的教程,涵盖了Hibernate框架的核心概念和技术要点。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它有效地解决了Java应用程序与数据库之间的数据交互问题,...
### Java SE - 马士兵笔记精要 #### 第1章 Java概述 - **Java语言的特点**: - **面向对象**:Java是一种完全支持面向对象编程的语言。 - **平台无关性**:通过Java虚拟机(JVM),Java可以在任何安装了JVM的...
马士兵Springboot课堂笔记