方法重写
方法重写的意义是实现多态
方法重写的规则
1.在继承关系的子类中重写
2.重写的方法名、参数、返回值类型必须与父类相同
3.私有方法不能继承因而也无法重写
4.访问修饰符不能比父类更严格(一般相同的就可以)
方法重写与方法重载的对比
位置 | 方法名 | 参数列表 | 返回值 | 访问修饰符 | |
方法重写 | 子类 | 相同 | 相同 | 相同 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不同 | 无关 | 无关 |
何时使用继承?
继承与真实世界类似,符合is-a关系的设计使用继承
继承是代码重用的一种方式,将子类都有的属性和行为放到父类中
抽象类abstract
抽象类:实例化没有意义
abstract把类和方法变为抽象的
Java中使用抽象类,限制实例化
abstract也可以用于方法——抽象方法
抽象方法没有方法体(public abstract void test(); )
抽象方法必须被定义在抽象类里
抽象方法必须在子类中被实现,除非子类是(抽象类)
public abstract void play(); //没有方法体
final用法
类不希望再被其他类继承:使用final类(类变为最终版的类)
public
final
class Piano extends instrument{ //....... }
方法不希望被重写:使用final方法(方法变为最终版的方法)
public
final
void play (){ //........}
属性值不希望 被修改:使用final修饰属性(属性变为最终版的属性)
public
final
class Piano extends instrument {
final
int keys=88;
}
final类不能再被继承
final常量只能使用,不能修改值,常量必须要赋初值
final方法不能被子类修改,子类只可以调用
静态static
static可以用来修饰属性、方法和代码块
static修饰的属性和方法成为类属性(类变量)、类方法
示例:
public static int A;//类属性\静态属性
public static void test(){
//类方法\静态方法\工具方法
}
B.test();//类方法不需要创建对象就可以使用
类属性的使用方式:
1.对象.类属性 2.类名.类属性(推荐)
类属性与普通属性的区别:
1.使用方式的区别:
类属性不需要创建对象就可以使用,普通属性必须要创建对象
类属性:类名.属性名 普通属性:对象名.属性名
2.各自的特点:
类属性属于全局的,所有的对象共用一个属性值
普通属性是每个对象属性值是特定的,改变一个对象的属性,另一个对象的属性值不会发生变化
一个类加载顺序:
静态属性(类属性)——>静态代码块——>普通属性——>代码块——>构造
如果类有静态属性或代码块,类初始化顺序:
父类的类属性——>父类的静态代码块——>子类的类属性——>子类的静态代码块——>父类属性——>父类代码块——>父类构造——>子类属性——>子类代码块——>子类构造
静态方法与非静态方法之间的相互调用:
1.静态方法不能直接调用非静态方法,非静态方法可以直接调用静态方法
2.如果静态方法非要直接调用非静态方法,
必须要创建对象
,通过对象.方法()来调用
静态方法:
在不使用类中普通属性的前提下,才能使用
只要类被加载,无需创建对象,就会调用类中的静态内容
例如:
public
static
void test(int a){
// d=30;//错误
Child child= new Child();
child.test();
}
例如:
public class Ch01 {
public int a;
public double b;
/**
* 判断两个对象的值是否相等
*/
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
// 判断是否是同一个对象
if (super.equals(obj)) {
return true;
} else {
// 判断是否是Ch01类型的对象
if (obj instanceof Ch01) {
// 强制类型转换
// 父类转子类
Ch01 c = (Ch01) obj;
if (a == c.a && b == c.b) {
return true;
}
}
}
return false;
}
}