什么是继承(extends)?
继承是:新定义的类是从已有的类中获取属性和方法的现象。 这个已有的类叫做父类, 从这个父类获取属性和方法的类叫做子类。
ExtendsDemo1.java
/*什么是继承*/
public class ExtendsDemo1 {
public static void main(String[] args) {
Truck t = new Truck();
t.size = 100; //不建议这么写。初始化成员变量最好使用构造方法,或者提供set(), get()接口.
//货车类的一个实例t从汽车类从继承了size, color属性。
//而货车比汽车多一个货箱
}
}
class Car { //汽车
int size; //车体大小
String color; //颜色
}
class Truck extends Car { //货车
String packingBox; //货箱
}
继承的好处
1. 提高了代码的重用性
2. 让类和类之间产生了关系, 为多态创造了条件。
继承(extends)的格式
class SubClass extends SuperClass {
//执行语句;
}
super关键字
1. super关键字和this的用法相同
2. this代表本类引用, super代表父类引用
3. 当子类和父类出现同名成员的时候, 可以用super 和 this进行区分
SuperDemo.java
/* super的用法
* 输出结果:
* super.i = 10, this.i = 20
*/
public class SuperDemo {
public static void main(String[] args) {
new SubClass().showMessage();
}
}
class SuperClass {
int i = 10;
}
class SubClass extends SuperClass {
int i = 20;
public void showMessage() {
System.out.printf("super.i = %d, this.i = %d\n", super.i, this.i);
}
}
对从父类继承过来的方法进行重写(Override)
1. 当子类中出现与父类一模一样的方法(返回值, 函数名, 形参)时, 会出现重写(Override)操作.
OverrideDemo1.java
/* 怎么对从父类继承过来的方法进行重写(Override)
* 输出结果:
* SuperClass: I am good~
* SubClass: I am excellent~~~
*/
public class OverrideDemo1 {
public static void main(String[] args) {
SubClass sc = new SubClass();
sc.speak();
}
}
class SuperClass {
public void speak() {
System.out.println("SuperClass: I am good~");
}
}
class SubClass extends SuperClass {
@Override //@Override表示下面出现的方法会出现重写操作,由编译器检查,如果达不到重写的条件,就会报错。一定程度上增加了代码的安全性
和健壮性
public void speak() {
super.speak();
System.out.println("SubClass: I am excellent~~~");
}
}
2. 在对父类方法进行重写(Override)操作的时候,子类不允许出现与父类同名同参但是不同返回类型的方法.
OverrideDemo2.java
/* 子类中不允许出现与父类同名同参但是不同返回类型的方法
* 出错信息:
* OverrideDemo.java:20: error: f() in SubClass cannot override f() in SuperClass
* public int f() {
* ^
* return type int is not compatible with void
* OverrideDemo.java:19: error: method does not override or implement a method from a supertype
* @Override
* ^
* 2 errors
*/
public class OverrideDemo2 {
public static void main(String[] args) {
}
}
class SuperClass {
public void f() {
}
}
class SubClass extends SuperClass {
@Override
public int f() {
return 1;
}
}
3. 子类重写父类的方法的访问权限要大于或者等于父类中被重写的方法
OverrideDemo3.java
/* 子类重写父类的方法的访问权限要大于或者等于父类方法的访问权限
* 出错信息:
* OverrideDemo.java:18: error: f() in SubClass cannot override f() in SuperClass
* protected void f() {
* ^
* attempting to assign weaker access privileges; was public
* 1 error
*/
public class OverrideDemo3 {
public static void main(String[] args) {
}
}
class SuperClass {
public void f() {
}
}
class SubClass extends SuperClass {
@Override
protected void f() { //把这里的访问权限改为public即可
}
}
访问控制符
访问控制符有:public, protected, default, private
有些需要一点包(package)的知识,所以等到讲包的时候再说.