java毕向东学习笔记——day09
内部类
- 外部类要访问内部类,必需先建立内部类的对象;
- 内部类可以直接访问外部类;
class Outer{
int x = 1;
class Inner{
int x = 2;
void function(){
int x = 3;
System.out.println(x);
System.out.println(this.x);
System.out.println(Outer.this.x);
}
void show(){
System.out.println("在主函数中成功地创建了内部类的对象!");
}
}
void method(){
Inner in = new Inner();
in.function();
}
}
class InnerDemo{
public static void main(String[] args){
Outer ot = new Outer();
ot.method();
System.out.println("------------------------------------");
Outer.Inner in = new Outer().new Inner();
in.show();
System.out.println("------------------------------------");
}
}
第二版
- 内部类处于成员的位置,因此可以被private和static修饰
class Outer{
static class Inner{
// 内部类处于成员的位置,因此可以被private和static修饰
void show1(){
System.out.println("在外部其他类中直接访问内部类的非静态方法");
}
static void show2(){
System.out.println("在外部其他类中直接访问内部类的静态方法");
}
}
}
class InnerDemo{
public static void main(String[] args){
System.out.println("------------------------------------");
new Outer.Inner().show1();
// 直接访问内部类的非静态方法
Outer.Inner.show2();
// 静态方法可直接由类名访问
}
}
内部类不处于成员位置时
class Outer1{
int x = 2;
void method(final int a){
final int y = 3;
//若局部变量不为常量,则无法被局部内部类访问
class Inner1{
//局部内部类不处于成员位置(1),无法被static修饰,因此也无法在其中定义static方法
//因为对于内部类,存在静态方法时,类也要求为静态,这就与(1)相矛盾
void show(){
System.out.println("局部的内部类");
System.out.println(x);
System.out.println(y);
}
void show2(){
System.out.println(a);
}
}
new Inner1().show();
new Inner1().show2();
}
}
class InnerDemo1{
public static void main(String[] args){
Outer1 o = new Outer1();
o.method(4); //method1执行完毕
o.method(5); //出栈后执行method2
}
}
匿名内部类
- 匿名内部类建立的前提是要继承一个类或者实现接口;
- 匿名内部类其实就是内部类的简写;
-
匿名内部类的常见使用情景:
Interface Inter{
public abstract void method();
}主函数{
show();
}public static void show(Inter in){
in.method();
}
如上,要传进show方法的参数是一个Inter类型的对象,一般情况是新建一个类实现Inter接口,而有了匿名内部类之后,可以采用如下方法:show(new Inter(){
void method(){}
});
/**
匿名内部类
*/
abstract class CeShi{
abstract void show();
}
class Outer{
int x = 3;
void function(){
CeShi s = new CeShi(){
//父类引用指向子类对象
public void show(){
System.out.println("x====="+x);
}
};
s.show();
//调用了匿名内部类的方法
}
}
class NiMinDemo{
public static void main(String[] args){
new Outer().function();
}
}
异常的抛出,捕获和处理
class Divide{
int div (int a, int b) throws ArithmeticException,ArrayIndexOutOfBoundsException{
int[] arr = new int[a];
int c = arr[3];
return a/b;
}
}
class ExceptionDemo{
public static void main(String[] args){
Divide d = new Divide();
try{
int x = d.div(3,1); //可修改为(4,0)测试除零异常
System.out.println(x);
}
catch(ArithmeticException e){
System.out.println("除零异常");
System.out.println(e.toString());
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
System.out.println(e.toString());
}
}
}
自定义异常
class Divide{
int div (int a, int b) throws ArithmeticException,ZiDindYiException{
if ((a/b)<0)
throw new ZiDindYiException("假装负数也是异常");
return a/b;
}
}
class ZiDindYiException extends Exception{ //自定义异常类
ZiDindYiException(String Message){
super(Message);
}
}
class ExceptionDemo{
public static void main(String[] args){
Divide d = new Divide();
int x = 0;
try{
x = d.div(3,-1);
}
catch(ArithmeticException e){
System.out.println("算术异常");
System.out.println(e.toString());
}
catch(ZiDindYiException e){
System.out.println("自定义异常");
System.out.println(e.toString());
}
System.out.println(x);
}
}
运行时异常
- 异常分两种:一种是运行时异常(RuntimeException),这种异常编译可过,但运行时会导致程序停止,需要程序员修改代码;一种是非运行时异常,编译都过不了,需要调用者自己调试。
- 常见的RuntimeException有ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException;
- 运行时异常可在方法中throw而不在方法外throws,程序会编译通过,并且即使在方法外throws而在主程序中未抛出或者catch,程序一样会编译通过;
- 因此在自定义异常时,应当考虑其继承的是RuntimeException还是Exception;
异常练习
/**
异常的练习
*/
class Teacher{
private String name;
private Computer pc;
Teacher(String name){
this.name = name;
}
void teach() throws NoClassException{
pc = new Computer();
try{
pc.useTeach();
}
catch(BlueException e){
pc.reset();
}
catch(CigaratteException e){
throw new NoClassException(name+"没法讲课咯");
}
}
}
class Computer{
int state = 3; //代表电脑工作状态,1正常工作,2蓝屏,3冒烟了
void useTeach()throws BlueException,CigaratteException{
if (state == 1)
System.out.println("电脑可以被用来讲课");
else if (state == 2)
throw new BlueException("电脑蓝屏了");
else if (state == 3)
throw new CigaratteException("电脑冒烟啦");
else
System.out.println("不存在的!");
}
void reset(){
if (state == 2)
state = 1;
System.out.println("电脑重启");
}
}
class BlueException extends Exception{
BlueException(String message){
super(message);
}
}
class CigaratteException extends Exception{
CigaratteException(String message){
super(message);
}
}
class NoClassException extends Exception{
NoClassException(String message){
super(message);
}
}
class ExceptionTest{
public static void main(String[] args){
Teacher t = new Teacher("毕老师");
try{
t.teach();
}
catch(NoClassException e){
System.out.println("放假放假!!");
}
}
}