对象类型转换catsing:
范围小 -> 范围大 : 自动类型转换
范围大 -> 范围小 : 强制类型转换
无继承关系的引用类型间的转换是非法的
==与equals方法:
==: 可以比较基础数据类型和引用类型,但是要注意类型兼容(可满足自动类型转换)
equals(): 只能比较引用类型
对于引用类型来说,
普通的类,==与equals方法都是比较是否指向同一对象(对象的内存地址)
特殊的类, 如String, File, Date, 使用==是否指向同一对象,而equals比较内容(在特殊类中equals方法被重写)
String对象的创建:
String str1 = "字面量创建";
String str2 = new String("new创建");
字面量创建String对象时,只在字符串常量池中创建一个值不重复的String对象
new创建String对象时,先在字符串常量池中创建一个值不重复的String对象,之后经过StringBuider在堆中再创建一个整合对象(会重复)
字面量创建比new创建更加省内存
包装类Wrapper:8种基本数据类型相应的引用类型
特别的是 int-integer char-character
Wrapper类方法可实现基本数据类型与字符串之间的转换: 静态ParseXxx()与valueOf()
int i = Integer.parseInt("123");//字符串转为int
String str = String.valueoOf(123);//int转为字符串
父类Object的toString()方法默认输出当前对象的内存地址(可重写)
syso(m) 等效 syso(m.toString())
static关键字:
static修饰属性,方法,代码块,内部类
类变量(静态变量),不需要实例化,直接通过类型.属性即可访问, 是类的一部分
类方法(静态方法): 把多次使用的方法抽取到工具类Utils中做成类方法
随着类的加载而加载,优先于对象存在,修饰的成员被共享,在访问权限允许的情况下可直接被调用
static方法里面只能使用该类的静态变量
重载的方法只能同为static或同为非static
单例(Singleton)设计模式:
设计模式:实际编程过程中总结出的一些解决问题的套路
单例:每个类只存在一个实例
核心:先将类的构造方法私有化,保证在类的外部无法通过new方法来创建对象,之后在类的内部定义一个私有的静态对象变量,然后在一个public的静态方法中返回这个私有的对象
饿汉式与懒汉式:区别在于new对象的时机
代码块{}:
new Person();
程序执行步骤:属性的默认初始化和显式初始化 -> 执行静态代码块(从上至下)-> 执行非静态代码块(从上至下)-> 执行构造器
static代码块只能使用静态变量与静态方法,且new多次对象时只会被执行一次
在匿名内部类中,代码块可以代替构造方法
Person per = new Person(){
{ //代码块充当构造器,对属性进行显式初始化
name = "李四"
}
@override public void xxx{}
}
创建了一个Person的匿名子类 -> 父类引用对象可指向子类对象 多态
final关键字:最终的
类不可被继承 方法不可被重写 修饰常量
常量命名约定大写, 如果多个单词, 用_分隔
抽象类 abstract class
提供了一个抽象的模板供特殊对象使用
既可对属性抽象,也可对方法抽象
不能被实例化, 可用来作为父类被继承
含有抽象方法的类必须被声明为抽象类
抽象方法: 只有方法的声明, 没有方法的实现,以分号结束
模板方法设计模式TemplateMethod:
子类具体实现父类的抽象方法,根据子类的不同需要,对父类的抽象方法进行重写
接口interface:
特殊的abstract类 只可对方法进行抽象
用implement关键字实现(应用
类只能单继承,但是可以实现多个接口
接口可以继承接口
类实现接口,必须重写接口的全部抽象方法,否则就要声明本类为抽象类
先写继承,再写实现
与继承类似,接口与实现类也存在多态的关系
工厂方法FactoryMethod
内部类:
内部类可以使用外部类的属性与方法
如果外部类想使用内部类,那么必须先实例化
内部类可以被private和protected权限修饰符修饰
内部类主要解决Java不能多重继承的问题:
类的各个内部类可以分别继承多个父类,变相实现了类的多重继承
Java异常:
异常处理机制:防止程序异常中断对后续代码造成影响
抓抛模型:捕获和抛出
捕获异常:
try catch:是为了防止程序中可能出现的异常
try{
可能发生异常的代码段
}catch(Exception e){//Exception是所有异常的父类,可有多个catch
syso(e.getMessage()); //得到有关异常事件的讯息
//Index 2 out of bounds for length 2
e.pintStackTrace(); //用来跟踪异常事件发生时堆栈的内容
//Ljava.lang.StackTraceElement;@5305068a
}finally{
//捕获异常的体系中一定最后会执行的部分,一般在io操作与JDBG中使用
}
抛出异常:在方法内出现的异常,交给调用方去处理
public void test() throws Exception{XXX}
main{try catch}
重写方法不能抛出比原方法更大的异常
人工抛出异常:
public void test() throws Exception{
XXX
throw new Exception("Out of range");
}