1.内部类
将类定义在另一个类的内部,叫做内部类。
内部类的特点:内部类可以直接访问外部类中的成员,而外部类要访问内部类的成员必须要建立内部类的对象.
内部类在不同的位置上具有不同的特性:内部类定义在成员位置上可以被private static修饰,被static修饰的内部类只能访问外部类中的静态成员;内部类定义在局部位置上,也可以直接访问外部类中的成员,同时也可以访问局部变量,但变量必须被final修饰.
匿名内部类 格式:new 父类或接口(){子类要覆盖的方法},使用前提:内部类必须是继承一个类或者实现接口,匿名内部类其实就是建立一个建立一个带内容的外部类或者接口的子类匿名对象.
interface MyIner
{
public abstract void show();}
class MyOuter
{
public void method()
{
MyIner my = new MyIner()
{
public void show(){ System.out.println("Hello world!");
};
my.show();
}
}
2.异常
异常就是程序运行时出现的不正常情况.
异常体系
异常的处理方式有两种:throws抛出异常和使用try catch语句
throw和throws的区别:throws用于标识函数暴露出的异常,thorws用在函数上,后面跟异常类名;throw用于抛出异常对象,throw用在函数内,后面跟异常对象.
异常的处理 try{需要检测的代码;}
catch(异常类 变量){异常处理代码;}
finally{一定会执行的代码;}
注意:finally代码块只有一种情况不会执行:之前执行了System.exit(0).如果finally代码块之前的语句中有return,return会在执行了finally代码块之后返回.
3.自定义异常
自定义异常需要继承Exception或者RuntimeException,并通过throw关键字将异常抛出.
//定义计算长方形面积的方法,当边长小于零时抛出异常,提示数据有问题
class FuShuException extends RuntimeException {
//构造函数初始化对象
FuShuException(String msg) {
super(msg);
}
}
class Rectangles {
public int getArea(int width, int height) throws Exception {
if (width <= 0 || height <= 0) {
throw new FuShuException("出现了负数的运算");//当出现负数时抛出内容为"出现了负数的运算"的FuShuException对象
}
return width * height;
}
}
异常细节:RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类.如果父类抛出多个异常,那么重写方法必须抛出那些异常的一个子集,不能抛出新的异常.
练习:老师上课,电脑出现三种情况:正常,开始上课;蓝屏,重启后变正常,开始上课;电脑烧坏了,无法上课
class LanPingException extends Exception
{
LanPingException(String msg)
{
super(msg);
}
}
class MaoYanException extends Exception
{
MaoYanException(String msg)
{
super(msg);
}
}
class ChangeException extends Exception
{
ChangeException(String msg)
{
super(msg);
}
}
class Computer
{
private int s = 2;//假定正常状态 s = 0,s=1蓝屏,s=2冒烟
public void run()throws LanPingException,MaoYanException
{
if(s==1)
{
throw new LanPingException("电脑蓝屏了!!");
}
if(s==2)
{
throw new MaoYanException("电脑冒烟了");
}
System.out.println("电脑开机了");//s=0时电脑正常运行
}
public void reset()
{
System.out.println("电脑重启了");
s = 0;//重启后电脑恢复正常
}
}
class Teacher
{
private String name;
Computer c = null;
Teacher(String name)//初始化老师对象
{
this.name = name;
c = new Computer();
}
public void teacher() throws ChangeException
{
try
{
c.run();
System.out.println(name+"老师开始上课");
}
catch (LanPingException e)
{
System.out.println("出现了蓝屏异常");
c.reset();//蓝屏就重启
teacher();
}
catch(MaoYanException e)
{
test();
throw new ChangeException("冒烟了,课程无法继续");//异常无法处理,继续抛出
}
}
public void test()
{
System.out.println("出现了冒烟,请大家自习");
}
}
class ExceptionDemo
{
public static void main(String[] args)
{
Teacher t = new Teacher("zhangsan");
try
{
t.teacher();
}
catch (ChangeException e)
{
System.out.println(e);
System.out.println("无法上课,调课");
}
}
}
4.模板设计模式
当功能一部分明确,一部分不明确的时候可以将不明确的地方暴露出去,延迟到子类去完成,这个思想就是模板方法设计模式.
练习:计算一个for循环的执行时间
abstract class GetTime
{
public final void gettime()
{
long start = System.currentTimeMillis();//记录开始时间
this.code();//利用this关键字调用本类的code()方法
long end = System.currentTimeMillis();//记录结束时间
System.out.println(end -start);//输出程序运行时间
}
public abstract void code();
}
class GetTimeExtends extends GetTime
{
public void code()
{
for (int x = 0 ;x < 10000 ;x++ )
{
System.out.print("y");
}
}
}
class Templet
{
public static void main(String[] args)
{
GetTimeExtends time = new GetTimeExtends();
time.gettime();
}
}
5.Object类
Object类是所有类的父类,这里列举几个比较重要的方法:
equals方法:比较两个对象的地址值,默认值是false,子类可以覆盖equals建立自己特有的比较方式;
toString方法,以字符串形式返回对象的描述;
hashCode方法,返回对象的哈希值码.
6.Java中的四种权限总结
7.关键字的使用总结
8.Jar包的操作
创建jar包
jar -cvf mypack.jar packa packb
查看jar包
jar -tvf mypack.jar
解压缩
jar -xvf mypack.jar
自定义jar包的清单文件
jar –cvfm mypack.jar mf.txt packa packb
学习感悟
内部类可以直接访问外部类,而外部类访问内部类需要先建立内部类对象.对于异常,虽然throws抛出比较快捷,但是个人感觉用try catch语句处理可以将异常显示得更加清晰,这才是王道.关键字在使用时不仔细想经常会用错,值得牢记.