一、内部类访问规则
1、内部类定义:
A、内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。
B、外部类要访问内部类,必须建立内部类对象。格式:
外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();
2、当内部类在成员变量上,就可以被成员变量修饰符所修饰。
比如:private,将内部类在外部类中进行封装。
static,内部类就具备static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
在外部其他类中,直接访问static内部类的非静态成员:new Outer.new Inner().function();
在外部其他类中,直接访问static内部类的静态成员:Outer.Inner.function();
3、当内部类中定义了静态成员,该内部类必须是静态类。
当外部类中的静态成员要访问内部类时,该内部类必须为静态类。
class Outer{
private int x = 3;
class Inner{
int x = 4;
void function(){
int x =6;
System.out.println("inner:"+Outer.this.x);
}
}
void method(){
Inner in = new Inner();
in.function();
}
}
public class InnerClassDemo01{
public static void main(String[] args){
Outer out = new Outer();
out.method();
//直接访问内部类中的成员
Outer.Inner in = new Outer().new Inner();
in.function();
}
}
二、匿名内部类
1、匿名内部类其实就是内部类的简写格式。
2、定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
3、匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4、匿名内部类就是一个匿名子类对象,而且这个对象有点胖。
5、匿名内部类中定义的方法最好不要超过3个。
使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。??
·匿名内部类不能定义任何静态成员、方法和类。??
·匿名内部类不能是public,protected,private,static。??
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。??
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
·内部类只能访问外部类的静态变量或静态方法。
interface Inter{
void method();
}
class InterImpl implements Inter{
public void method(){
System.out.println("hello world!!");
}
}
public class InnerDemo{
public static void main(String[] args){
InterImpl impl = new InterImpl();
show(impl);
}
public static void show(Inter abc){
abc.method();
}
}
三、异常
1、异常定义:异常就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:一种是严重的问题,一种是非严重的问题。
对于严重的:java通过Error进行描述。对于Error一般不编写针对性的代码对其进行处理。
对于非严重的:java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。
无论Error或者Exception都具有一些共性内容,比如:不正常情况的信息,引发原因等。
Throwable
|---Error
|---Exception
|---RuntimeException
|---非RuntimeException
2、异常的处理
java提供了特有的语句进行处理。
try{
需要被检测的代码;
}catch(异常类 变量名){
处理过程;
}finall{
一定会运行的语句;
}
对多异常的处理:
声明异常时,建议声明更为具体的异常,这样处理的可以更具体。
对于声明几个异常就对应几个catch块,不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
在进行catch处理时,catch处理语句中一定要定义具体处理方式,不要简单定义一句e.printStackTrace(),也不要简单的就书写一条输出语句。可以将异常写入日志异常文件。
3、异常的抛出:throws在方法体后面抛出。
4、自定义异常类
自定义异常类:因为项目中会出现特有的问题,而这些问题并未被java所描述并封装成对象,所以对于这些特有的问题可以按照java的对问题的封装的思想将特有的问题进行自定义的异常封装。
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作,要么在内部try catch处理,要么在函数上声明让调用者处理。一般在函数内出现异常,函数上需要声明.
继承Exception原因:
异常体系有一个特点,因为异常类和异常对象都被抛出。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象蔡可以被throws和throw操作。
5、throws和throw的区别
throws使用在函数上;throw使用在函数内。
throws后面跟的异常类,可以跟多个,用逗号隔开;throw后面跟的是异常对象。
6、继承Exception、RuntimeException。
5、finally
一定会执行的代码块。
四、包
包的四种访问权限。
总结:
1、内部类、匿名内部类(直接声明方法、定义对象);
2、异常体系,注意RuntimeException。