一、内部类
一、定义
如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
二、访问规则
1、内部类方法可以访问该类所在的类中作用域的成员,包括私有成员变量。
2、内部类可以对同一个包中的其他类隐藏起来,从而不被访问。
三、访问格式
1、当内部类定义在外部类的成员位置上,而且非私有,可在外部其他类中直接建立内部类对象。
格式:外部类名.内部类名 变量名=new外部类对象.new内部类对象
Outer.Inner in=new Outer().new Inner();
比如:private:将内部类在外部类中进行封装。
static:内部类就具备static的特性。
当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
在外部类其它类中如何直接访问static内部类的非静态成员呢?
new Outer.Inner.()function();
在外部其它类中,如何直接访问static内部类的静态成员呢?
uter.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static。
class Outer//外部类
{
private int x=3;//外部成员变量
class Inner//内部类
{
int x=4;//内部成员变量
void function()
{
int x=5;//内部局部成员变量.
System.out.println(Outer.this.x);
}
}
//定义一个方法建立内部类对象.
void method()
{
Inner in=new Inner();
in.function();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
/*
Outer.Inner in=new Outer().new Inner();//直接建立内部类对象.
in.function();//调用function()方法
*/
}
}
四、内部类定义原则
1、何时定义内部类:当一个类需要直接访问另一个类中的成员时,则当这个类放入另一个类中,并将内部类封装。
2、局部内部类:当内部类只在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。
3、内部类定义在局部的情况:1)不可以被成员修饰符修饰。
2)可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
示例2:
class Outer//外部类
{
int x = 3;//成员变量
void method(final int a)
{
final int y = 4;//被final修饰的常量
class Inner//局部内部类
{
void function()
{
//只能方法被final修饰的常量因为.
//因为一常量在常量池比方法存在的时间长.
System.out.println(y);
}
}
//如果放在上面编译失败.因为虚拟机还不知道有内部类Inner呢.
new Inner().function();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method(7);
out.method(8);
}
}
五、匿名内部类
1、匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象。想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。
2、定义前提:1)内部类必须继承一个类或实现接口。
2)但是有一种很特殊,可以不直接继承一个父类,仍可定义一个匿名内部类。因为任何类都是Object的子类。
3)格式:匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。
3、使用场景:当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。
示例4:
abstract class AbsDemo//父类
{
abstract void show();
}
class Outer外部类
{
int x = 3;
public void function()
{
//匿名内部类
AbsDemo d = new AbsDemo()
{
int num = 9;
void show()
{
System.out.println("num==="+num);
}
void abc()
{
System.out.println("haha");
}
};
d.show();
//d.abc();//编译失败;
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().function();
}
}
——————————————华丽的分割线————————————
二、异常
Throwable:可抛出的。
|--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|--Exception:异常,可以有针对性的处理方式。
四、异常体系的特点
异常体系中的所有类以及建立的对象都具备可抛性,也就是说可以被throw和throws关键字所操作,只有异常体系具备这个特点。
五、异常分为两种
1)编译时被检测异常:该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
该异常被标识,代表这可以被处理。
2)运行时异常(编译时不检测):
在编译时,不需要处理,编译器不检查。
try
{
//需要被检测的代码;
}
catch (异常类 变量)
{
//理异常的代码;(处理方式)
}
finally
{
//一定会执行的语句;
}
注意:
1)finally中定义的通常是 关闭资源代码。因为资源必须释放。
2)finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。
2、如何自定义异常?
当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
class LanPingException extends Exception//自定义蓝屏异常.因为可以处理集成Exception
{
LanPingException(String Message)//覆盖父类的方法
{
super(Message);//因为父类有赋值方法.直接用就OK了
}
}
class MaoYanException extends Exception//自定义冒烟
{
MaoYanException(String Message)
{
super(Message);
}
}
class NoPlanException extends Exception//课时计划完不成.讲师的异常
{
NoPlanException(String Message)
{
super(Message);
}
}
class Computer//电脑类
{
private int count=3;//定义一个变量为1的时候正常.2的时候代表蓝屏.3.冒烟
void run()throws LanPingException,MaoYanException//run电脑启动
{
if(count==2)
throw new LanPingException("蓝屏");//抛出蓝屏异常,不在这里处理是因为电脑自身处理不了
if(count==3)
throw new MaoYanException("冒烟");
System.out.println("电脑启动");
}
void reset()//电脑重启.重启之后count变量为1.电脑正常运行
{
System.out.println("电脑从启");
count=1;
}
}
class Teachar//讲师类.毕老师
{
private String name;//将名字设为私有
private Computer comp;//电脑类私有
Teachar(String name)
{
this.name=name;//用构造函数.将name和电脑computer初始化
comp=new Computer();
}
void prelect()throws NoPlanException
{
try//因为电脑处理不了异常.所以在这里try
{
comp.run();
}
catch (LanPingException e)
{
comp.reset();//蓝屏之后调用从启方法
}
catch (MaoYanException e)
{
test();//冒烟之后启动自习.因为解决不了.所以抛给张老师
throw new NoPlanException("课程无法继续"+e.getMessage());
}
System.out.println("讲课");
}
void test()
{
System.out.println("自习");
}
}
class ExceptionTest
{
public static void main(String[] args)//主函数.也代表Boss
{
Teachar t=new Teachar("毕老师");//创建Teachar对象并让毕老师讲课
try
{
t.prelect();//因为电脑冒烟了.毕老师蒙圈了.问题交给boss张老师来处理
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("换老师或者放假");
}
}
}