默认值
数据类型 | 默认值 |
整型 | 0 |
浮点型 | 0.0 |
布尔型 | false |
字符型 | 空字符 |
引用类型(数组、类、接口) | null |
成员变量、局部变量、静态常量
成员变量
定义在类中的变量,称为成员变量,拥有默认值,不赋值也能使用。
生命周期:类创建对象,成员变量初始化;类对象回收,成员变量销毁。
局部变量
定义在方法中的变量,称为局部变量,默认有默认值,赋值后才能使用
生命周期:方法调用,局部变量初始化;方法调用结束,局部变量销毁。
静态常量
static修饰属性时,通常和final一起使用,表示静态常量。通过类名或者通过对象访问。
生命周期:随着类的加载而存在,类的销毁而销毁。
构造方法
- 构造方法没有返回值(不是void),方法名同类名。
- 每个类定义时,都有一个默认隐藏的无参构造方法,在创建对象时调用。如果自己写了带参数的构造方法,默认隐藏的无参构造方法就会失效,这时如果需要使用无参构造方法,就要自己把它写出来。
- 构造方法执行时不一定创建对象。创建子类时会自动执行父类的构造方法,但是不会创建父类对象。
- 构造方法只能通过new关键字创建对象时自动调用,所以构造方法通常用于初始化成员变量。
- 构造方法天生就是重载,默认一个类里面所有的构造方法都是重载关系。
重写与重载
重写override
子类继承父类后,对父类中非私有的方法进行扩展或覆盖,这个过程叫做方法重写。
- 方法名、参数列表、返回值要与父类相同。
- 子类的访问权限的范围要么与父类一致,要么更大。
- 不能抛出比父类更大的异常。
public class Father{
protected void age(){
System.out.println("父亲50岁");
}
}
public class Son extends Father{
public void age(){
System.out.println("儿子25岁");
}
public static void main(String[] args) {
Son son=new son();
son.age();
}
}
//输出 儿子25岁
重载overload
一个类中,如果多个方法的方法名相同,参数列表不同,这些方法称为重载的方法。
- 同名不同参。
- 方法重载与返回值无关。
public class test{
public test(){}
public test(int i){}
public test(String i){}
public test(int i,String i){}
}
this和super关键字
当做对象使用
- 只能用在非静态方法中。
- “this.属性”或“this.方法”,此时的this表示当前所在的类的对象。
- “super.属性”或“super.方法”,此时的super表示父类的对象。
当做构造方法使用
- 只能用在构造方法的首行。
- “this([参数])”,表示调用当前类的某个构造方法。
- “super([参数])”,表示调用父类的某个构造方法。
向上转型和向下转型
必须存在继承关系
向上转型
子类对象转换为父类对象的过程称为向上转型(自动转换)。直接将子类对象保存到父类变量中。
public class Son{
Son son = new Son();
Object object = son;
}
向下转型
父类对象转换为子类对象的过程称为向下转型(强制转换)。
转换方式:(目标类型)要转换的对象;
class Son{
Object object = new Object();
Son son = (Son)object;
}
抽象类与接口
抽象类
用abstract class定义
- 有构造方法,不能创建对象,在创建子类对象时调用构造方法。
- 抽象类中可以有抽象方法,也可以有普通方法。
- 抽象类被子类继承时,使用extends关键字。子类必须重写父类中所有的抽象方法。
- 子类只能继承一个抽象类
接口
用interface定义
- 没有构造方法,不能创建对象。
- 接口中的属性都是公共的静态常量。接口中的方法都是公共的抽象方法。
- jdk1.8后,可以在接口中定义default方法和static方法
- 接口被实现类实现时,使用implements关键字。实现类必须重写父接口中所有的抽象方法。
- 实现类可以实现多个接口。
extends和implements的使用
- 类A extends 类B
- 类A implements 接口A,接口B...
- 接口A extends 接口B
- 类A extends 类B implements 接口A,接口B...