在说继承之间,我们先脱离代码,来分析一下现实世界。大家不要惊慌我们分析的并不是什么多高大上的问题。就是请问按照血缘关系来说,小明同学有几个爸爸?我想大家的反应就是:这不是废话吗,肯定一个呀。
好那这个问题就解决了。
java中的继承也是一样,继承只能单继承。继承的目的就是为了重用父类成员。
继承的格式如下:
[修饰符] class 类名1 extends 类名2{
[成员]
}
这段代码的意思是这样的,类名1继承了类名2。
类名1 是类名2的子类
类名2 是类名1的父类
一个子类只能有一个父类
一个父类可以有多个子类
比如我们定义一个动物父类Animal
package oop1;
public class Animal {
private String eyes;
private String nose;
private String ear;
public String getEyes() {
return eyes;
}
public void shout() {
System.out.println(eyes);
System.out.println("怎么叫??");
}
}
我们再定义一个子类Dog,
package oop1;
public class Dog extends Animal{
/**
* 方法重写
*/
public String getEyes() {
return "dog's eyes";
}
public void shout() {
System.out.println(getEyes());
System.out.println("汪汪汪");
}
}
下面我们再聊一下重写(只针对方法)override:
如果子类中包含了一个和父类相同的方法(修饰符可以相同,也可以变大,返回类型相同,方法名相同,参数相同),这个时候我们成为子类重写了父类的方法。如果父类的方法不能满足子类的需求。可以在子类中重写父类的方法,添加新的功能上去。
而后是重载overload:
在同一个类中,方法名相同,参数不同(参数类型或者个数不同),返回类型不同不能称为重载。
成员方法重载:
public void shout() {
System.out.println(this.getEyes());
System.out.println("汪汪汪");
}
public void shout(String a) {
}
构造方法也可以重载:
public Dog() {
//super();//必须在构造方法的第一行
this("眼睛","鼻子","耳朵");//也只能出现在第一行
System.out.println("Dog");
}
public Dog(String eyes,String nose,String ear) {
super(eyes,nose,ear);//不写的时候默认调用父类的无参构造方法
}
接下来再普及一下基础的东西:
this
this代表当前类,this调用的是当前类的成员。
调用当前类方法,this.方法名(参数)
调用当前类的变量 this.变量
调用当前类的构造方法 this(参数)
//必须在构造方法第一行
super
super代表的是父类对象 super代表的是父类的成员
调用父类方法 super.方法名(参数)
调用父类变量super.变量
调用父类的构造方法super(参数)
//必须在构造方法的第一行
另外再普及一下权限修饰符:
Java中权限修饰符有4个
Private 私有的
默认(默认就是没有不写)
protected 受保护的
Public 公开的
接下来是使用这些修饰符后的范围
同类 | 同包 | 继承 | 不同包 | |
---|---|---|---|---|
private | √ | × | × | × |
默认 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |