方法的重写
方法的重写有两个约束条件:
一、(出现在继承中,处于子类中)在子类中,重写的方法必须与父类中的被重写的方法完全相同,局限于(方法的名字,方法的返回值,方法的参数)完全一致。
二、子类中重写的方法、访问权限修饰符可以与父类相同或者大于父类。
方法重写后,在调用子类中被重写的方法时,会优先调用子类中的被重写的方法。
父类:
class A {
public void test() {
}
}
子类:
class B extends A{
@Override
public void test() {
}
}
访问权限修饰符
修饰符 | 本类 | 同包 | 非同包子类 | 其他 |
---|---|---|---|---|
private | ✔ | ✖ | ✖ | ✖ |
default | ✔ | ✔ | ✖ | ✖ |
protected | ✔ | ✔ | ✔ | ✖ |
public | ✔ | ✔ | ✔ | ✔ |
(protected)提示:
父类中的属性被protected所修饰,且子类与父类不在同一(package)中,子类仍可调用父类中被protected修饰的成员方法或成员变量。
代码示例:
方法的重载
方法的重载:
一、方法的名字要与被重载的方法相同。
二、重载的方法的参数列表、参数类型、个数必须不同。
三、重载的方法与返回值的类型无关。
方法的重载和方法的重写的区别:
方法的重载存在于同类之中而方法的重写则存在于继承的子父类或者接口之中。
abstract关键字
abstract :(抽象的、摘要)可以修饰的有:类、成员方法
【要点】
1️⃣被abstract修饰的方法没有实现(方法体);并且,被修饰的方法所处的类必须是被abstract修饰的抽象类。
2️⃣被abstract修饰的父类中的抽象方法,其子类必须重写该方法(被abstract修饰的抽象方法)。
3️⃣被abstract修饰的类不能new对象。
4️⃣抽象类中不一定只有抽象方法,但是有抽象方法的一定是抽象类。
final关键字
final:(意为:最终)可以修饰【类】、【成员方法】、【成员变量】、【局部变量】。
1️⃣类:被final修饰的类,不可以被继承,即:(断子绝孙)。如:String类。
2️⃣成员方法:被final修饰的成员方法,不可以被重写。
3️⃣成员变量:被final修饰的成员变量有且只能被赋值一次,赋值之后不可以修改;
4️⃣局部变量:被final修饰的局部变量,在被定义时,需要初始化赋值,否则报错。
Final关键字延伸:
final class Dog { //被final修饰的类、不可以被继承
String name;
int age;
}
class Test {
public static void main(String[] args) {
final Dog dog = new Dog();
dog.name = "小黑";
dog.age = 12;
// 那其中的属性还可以修改么?
dog.name = "小白"; ✔
dog.age = 11; ✔
//可以修改,详解如下:
// 对么?
dog = new Dog(); ✖
}
}
延伸详解:
此时的dog在内存空间的样式是这样的:
在这里插入图片描述
当 对Dog类创建(实例化)对象的时候;即 new Dog()时会在堆区开辟一块空间来存储。而Dog dog中的dog是个引用型变量 存储的是一个地址,而这个地址指向的是堆中的 new Dog()和存储在堆区的数据,也就是说 被final修饰的 Dog dog 中的 dog(存储的是地址)这个引用型变量的地址是不可以改变的。而上述代码中dog.name = "小白"改变的是堆区Dog的属性,而不是改变的地址,因此此代码是可行的。而其下述代码中则是又重新创建了一个新的对象和新的地址,把新的地址赋值给了dog,这一步是改变dog的地址指向,也就是说改变了dog存储的地址,因此,此举是错误的。