Ⅰ.javacore
多态
多态就是 父类引用指向子类的对象
向下转型:父类对象的引用赋值给一个子类对象,也就是把父类转换成子类。此时必须进行强制类型转换。
向上转型:就是把子类转换成父类,这符合继承中的is-a(狗是宠物),这是自动的类型转换。
如果Pet是父类 那么它就可以指向一切它的子类
例如:
Pet pet = new Dog()//new Cat。。。。
注意:这个对象只能调用父类和子类共有的方法,即子类重写的父类的方法,而不能调用子类独有的方法
总之: 如果想调用某个类独有的方法,那么就自己new自己
如果需要更大的扩展性,就父类引用指向 子类 来创建对象
向下转型只允许强转为指向自己的类型,不能转为其他子类
增强了程序的扩展性
抽象类和抽象方法
使用abstract修饰的类称为抽象类,抽象类不可以实例化,更符合父类的用途
使用abstract修饰的方法称为抽象方法,抽象方法没有方法体,且所有子类必须重写父类的抽象方法
抽象方法一定是抽象类
抽象类不一定有抽象方法
接口
接口使用interface来修饰,接口中所有的方法都是抽象方法
接口遵循多态的特性,即接口可以指0向它的所有实现类
接口中所有的方法都是抽象方法,无需显式的使用abstract来修饰
接口中所有的方法都是公用的
接口实际上就是定义了标准,如果需要某个操作,那么就实现某个接口
接口不可以被实例化,也没有构造方法
接口中所有的成员都是公共的 静态的 常量
接口可以继承接口,普通类只能实现接口
抽象类和接口都可以实现多态的特性,但是思想不同,抽象类更关注于本质,而接口更关注于操作
面向接口编程步骤:
①找出操作相同,但操作内容不同的方法,创建接口
②创建实现类,去实现不同的操作(黑白/彩色 打印机)(声卡/ 网卡)
③编写设置不同操作的方法(更改打印机,更改网卡和声卡),注意:参数要定义为接口,而不是具体类
④就可以按照需要去向③步骤中的方法传递参数
异常处理和log4j
①程序的运行分为三种情况:
正常运行 只会执行try体中的代码,不执行catch
出现异常 并且和catch中的异常类型相匹配,执行catch ,并打印堆栈信息
出现异常 但是和catch中的异常类型不匹配,不会执行catch
②finally
无论如何都会执行的代码。一般用于流关闭的操作。
③一般来说我们采取的做法都是在catch块中添加Excaption,也就是总异常。
他是所有异常的父类,可以抓取所有的异常,避免由于异常类型不同而抓取不到的情况
在catch块中,我们使用的是printStackTrack(),即打印堆栈信息,这个显示的较为全面
有利于排错,而另一个方法,getMessage只会显示出错信息,不太常用。
④如果方法内部有异常抛出throw
那么此方法必须要在参数列表之后声明抛出的异常,throws如果有其他方法调离此方法,那么可以选择处理这个异常(try catch)或者继续抛出throws
⑤程序运行过程中
我们需要在某些地方加入程序运行的记录,以便对于程序的监视和排错,那么log4j就可以做这个工作。
⑥log4j使用方法:
1.将log4j的jar包放在项目工程下面,然后选中jar包,右键add as library
2.将资源文件log4j.properties 放在src根目录下面
3.在需要记录的类中可以创建Logger对象,注意包的路径不要导错
4.可以根据自己的调试级别来决定日期的打印频率,如果设置为log4j.rootLogger=error,那么只有错误的时候才会计入日志
如果设置debug,那么所有的日志都会被记录。
静态代码
①执行顺序:
静态变量》静态代码块》实例变量》代码块》构造方法
②final
final修饰的实例变量的值不能改变,这就意味着在实例化具有fianl变量的多个对象时,每个对象都会有相同的final变量值,这种
实例变量反而使用静态变量会更符合设计规划,因此经常将final变量同时定义为静态的(static final);
final修饰不同变量的结果:
final修饰变量,那么这个变量就会变为常量,即不可改变的量
final修饰类的话,指定该类为最终类不可被继承;
final修饰方法的话,指定该类不允许被重写(覆盖);
包装类和匿名类、Object类
1.包装类
①Integer整形
int i = 10;
Integer in = new Integer(i); //将int类型的i转换为Integer类型
int a =in.intValue() ; //将Integer类型的对象转换为int类型
int b =Integer.parseInt("123"); //将字符串转换为整型
②自动拆装箱
即系统将自动进行基本数据类型和对应包装类型的转换。
基本数据类型:
int,double,float,long,short,char,byte,boolean
装箱:
基本数据类型转换为引用数据类型
拆箱:
引用数据类型转换为基本数据类型
//int类型将自动转换为Integer类型——————————装箱
int m = 12;
Integer in = m;
//Integer类型将自动转换为int类型——————————拆箱
int n = in;
2.匿名类
特点:
类不取名字,而是直接采用其父类的名字 或者他所实现的接口的名字来构造
类的定义与创建该类的一个实例同时进行,即类的定义前面加一个new。不使用class关键字,同时带上()表示创建对象,即:
public class TestInner {
public static void main(String[] args) {
Object object = new Outer().makeTheInner(44);
System.out.println(object);
}
}
public class Outer {
private int size = 6;
public Object makeTheInner(final int localVar){
return new Object(){
@Override
public String toString() {
return "interSize:"+size+",localVar:"+localVar;
}
};
}
}
new 类名或接口名(){…}
类名前不能有修饰符
类中不能定义构造方法,因为他没有名字。
3.Object类
特点:
是所有类的父类
可以和任意类型的对象匹配
方法 | 说明 |
---|---|
protected Object clone() | 生成当前对象的一个备份,并返回这个复制对象 |
public boolean equals(Object obj) | 比较两个对象是否相同,是则返回true |
public final Class getClass() | 获取当前对象所属的类信息,返回Class对象 |
protected void finalize() | 定义回收当前对象时所需完成的清理工作 |
public String toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
public final void notify() | 唤醒线程 |
public final void notifyAll() | 唤醒所有等待此对象的线程 |
public final void wait() | 等待线程 |
①==与equals
如果使用此方式比较,当name为null时会出现空指针异常
name.equals("admin")
更换为此方法可以避免空指针异常
“admin”.equals(name)
class TestEqualsString{
public static void main(String[] args){
String name1 = new String("张三");
String name2 = new String("张三");
System.out.println(name1==name2);//两个对象的引用,false
System.out.println(name1.equals(name2));//内容相等,true
String name3 = "李四";
String name4 = "李四";
System.out.println(name3==name4);//相同常量的引用,true
System.out.println(name3.equals(name4));//内容相等,true
}
}