简单整理一下今天上课讲的,也顺便复习一下不至于忘得太快,争取用一个小时复习完。
内部类
内部类的存在可以辅助接口更好的实现多继承的效果,可以把冲突的方法等放到内部类中起到区分作用。
定义
在类A中声明了类B,称B为内部类,类A称为类B的外嵌类。
A的成员变量在B内仍然有效,B可以访问A中的所有成员和方法,内部类仅供其外嵌类使用,对外隐藏,所以不能存在static。
继承性
外嵌类的子类能够继承该类的内部类;内部类也可以继承自其他的类。
一个外嵌类中可以有多个内部类,而且内部类也能继承内部类(相当于把一个类A当作环境,在里面再进行类的定义、继承等普遍动作,但是内部类只在这一个小环境中有效,在A外无效);甚至可以将一个内部类声明为抽象类,然后再继承它!
声明与调用
public class RedCowForm {
static String formName;
RedCow cow; //内部类声明对象
RedCowForm() {
}
RedCowForm(String s) {
cow = new RedCow(150,112,5000);
formName = s;
}
public void showCowMess() {
cow.speak();
}
class RedCow { //内部类的声明
String cowName = "红牛";
int height,weight,price;
RedCow(int h,int w,int p){
height = h;
weight = w;
price = p;
}
void speak() {
System.out.println("偶是"+cowName+",身高:"+height+"cm 体重:"+weight+"kg,生活在"+formName);
}
} //内部类结束
}
public class Example7_1 {
public static void main(String args[]) {
RedCowForm form = new RedCowForm("红牛农场");
form.showCowMess();
form.cow.speak();
//RedCowForm.RedCow redCow = new RedCowForm.RedCow(180,119,6000);
//redCow.speak();
}
}
匿名类
匿名类也是内部类,是在使用new关键字创建父类对象时,不声明而直接使用的类,作用是无须声明子类而直接创建该子类的对象。匿名类是其父类的“无名子类”,因此可以覆盖父类的方法。
如果需要创建子类,但是子类只被调用一两次,只是临时使用,那么使用匿名类可以省去类的声明过程,直接在使用时定义一下即可。
class People
{
String name;
int MathScore=99;
People(String name)
{
this.name=name;
}
void showScore()
{
System.out.println(MathScore);
}
}
public class Test0324_Xian {
public static void main(String[] args) {
// TODO code application logic here
People p = new People("小明")
{
void showScore()
{
System.out.println(MathScore+20);
}
};
p.showScore();
}
}
run:
119
除此之外,Java也允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了接口的类省略了类声明后的类体,也是匿名类。这种方法通常用于在Runnable接口的基础上创建类体,来增加临时性的线程。
异常处理
异常就是程序运行中的一些错误,但是这些错误等级有点低(区别于Error),不至于导致程序无法运行,可以通过编写代码捕获和处理 。
异常类
程序运行过程中,出现一个可以识别的异常时,JVM会创建一个异常类的对象等待处理 。异常类为Exception及其子类,也可以自己创建异常类(继承于Exception)。
异常处理
抛出异常- throw,throws
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
throws用在自己定义方法时,把可能遇到的异常抛出。格式为:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }
捕获异常- try,catch,finally
其中finally可以不写。详细用法见下面注释。
try {
//包含可能发生异常的语句
//当try部分中的某个语句发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分;
}catch(ExceptionSubClass1 e) {
/*
对异常的处理语句放在 catch部分,可以包含多个catch语句,分别处理发生的相应异常,通常会用到两个方法:
getMessage() :返回一个字符串对发生的异常进行描述。
printStackTrace() :给出方法的调用序列,一直到异常的产生位置
*/
}catch(ExceptionSubClass2 ex) {
}
……
finally{
//不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源
}
public class Test0324_Xian {
public static void main(String[] args) {
try{
System.out.println("第一行");
System.out.println(3/0);
System.out.println("第三行");
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("无论如何都会输出!");
}
}
}
run:
第一行
无论如何都会输出!
java.lang.ArithmeticException: / by zero
at test0324_xian.Test0324_Xian.main(Test0324_Xian.java:21)
断言
还没学......