继承介绍
继承:让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员
继承的格式
格式:public class 子类名extends父类名{}
范例:public class Zi extends Fu {}
Fu:是父类,也被称为基类、超类
Zi:是子类,也被称为派生类
public class ExtendsDemo1{
public static void main(String[]args){
}
}
/** 创建类的细节:...*/
class Coder {
String name;
int age;
double salary;
}
class Manager {
String name; int age;
double salary;
}
什么时候使用继承
当类与类之间,存在相同(共性)的内容,并且产生了 is a 的关系,就可以考虑使用继承,来优化代码。
子父类中,如果出现了重名的成员变量,使用的时候会优先使用?
根据就近原则,优先使用子类的
那我就要用父类的,怎么办?
继承中的成员访问特点 - 成员变量
this:调用本类成员
super:调用父类成员
public class Fu {
int num = 10;
}
class zi extends Fu {
int num =20;
public void method(){
int num =30;
System.out.println(num); // 30
System.out.println(this.num); // 20
System.out.println(super.num); // 10
}
}
方法重写与重载
方法重载(Overload):在同一个类中,方法名相同,参数不同,与返回值无关
参数不同:类型不同,个数不同,顺序不同
方法重写(Override):在子父类当中,出现了方法声明一模一样的方法(方法名,参数,返回值)
例:
方法重写:
class Father {
public void method(){
System.out.println("Father...method..");
}
}
class Son extends Father{
public void method() {
System.out.println("Son...method");
}
}
输出:
Son...method
方法重载:
class Father {
public void method() {
System.out.println("Father...method..");
}
}
class Son extends Father{
public void method(int num){
System.out.println("Son...method");
}
}
输出:
Father...method..
方法重写的使用场景
当子类需要父类的方法,但是觉得父类的方法逻辑不好(修改|增强)就可以对父类的方法进行重写
例:
public static void main(String[] args){
Son s=new Son();
s.love();
}
}
class Father {
public void love(){
System.out.printin("送花");
System.outprintln("送肉");
System.outprintln("唱歌");
}
}
class Son extends Father {
@Override
public void love() {
System.outprintln("送酱肉包");
System.out.println("送口红");
System.out.println("我喜欢你,一起去爬山吗~");
}
}
注意事项
父类中私有方法不能被重写
子类重写父类方法时,访问权限必须大于等于父类
排序:
权限修饰符
private > (default) > protected > public
Java 中继承的特点
Java只支持单继承,不支持多继承,但支持多层继承
例:
public class ExtendsDemo4 {
public static void main(String[] args){
C c=new C();
c.methodC();
c.methodB();
c.methoda();
}
}
class A {
public void methodA() {
System.out.println("A...");
}
}
class B extends A {
public void methodB(){
System.outprintln("B...");
}
}
class C extends B{
public void methodC(){
System.out.println("c...");
}
}
输出:
C...
B...
A...
小细节
除了Object类,在所有构造方法的第一行代码,都默认隐藏了一句话super();
通过这句代码,访问父类的空参数构造方法
例:
public class Test {
public static void main(string[] args){
Zi z1=new Zi();
Zi z2 =new Zi(num:10);
}
}
class Fu {
public Fu() {
System.out.println("Fu类的空参构造方法");
}
}
public Fu(int num){
System.out.println("Fu类的带参构造方法...");
}
}
class Zi extends Fu {
public zi(){
System.out.println("Zi类的空参构造方法");
}
}
public zi(int num) {
System.out.println("Zi类的带参构造方法...");
}
}
输出:
Fu类的空参构造方法
Zi类的空参构造方法
Fu类的空参构造方法
Zi类的带参构造方法...
super 调用父类成员的省略规则:
super.父类成员变量|super.父类成员方法()
-> 被调用的变量和方法,在子类中不存在,super.可以直接省略的
class Fu {
int num =10;
public void show(){
System.out.println("Fu...show");
}
}
class Zi extends Fu {
public void method(){
System.outprintln(num);
show();
}
}