Java零基础之-继承以及方法的覆盖(super关键字)

面向对象三大特征:封装、继承、多态。

继承:

  1. ”基本作用“:代码复用。

  2. ”重要作用“:有了继承才有了以后的”方法覆盖“和”多态机制“

  3. 语法格式
    [修饰符列表] class 类名 extends 父类名{
    类体=属性+方法;
    }

  4. Java语言只支持单继承,一个类不能同时继承很多类。C++支持多继承。

  5. 有关术语:
    B类继承A类,其中:
    A类被称为:父类、基类、超类、superclass
    B类被称为:子类、派生类、subclass

  6. 子类都可以继承父类的哪些数据?
    -私有的不支持继承
    -构造方法不支持继承
    -其他数据都可以被继承

  7. 虽然Java只支持单继承,但是一个类可以间接的继承其他类。
    C继承B,B继承A,那么C就间接继承了A。

  8. 重点:java语言中,如果一个类没有显示继承任何类,那么该类默认继承JavaSE库当中提供的java.lang.Object类。java语言中任何一个类都有object类的特征。

继承的优点:

  • 继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
  • 在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
  • 可以在子类中声明一个在父类中没有的新字段和方法;
  • 可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
  • 可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。

方法覆盖:

  1. 方法覆盖又称为方法重写(override);
  2. 当父类中的方法已经无法满足当前子类的业务需求,需要使用方法重写;
  3. 方法重写发生在具有继承关系的父子类之间,条件是:返回值类型相同,方法名相同,形参列表相同;访问权限不能更低,可以更高(下面解释);抛出异常不能更多,可以更少(这一条还不能理解)。
  4. 注意:私有方法和构造方法不能继承,所以不能覆盖;静态方法不存在覆盖;覆盖只针对方法,不谈属性。

访问权限不能更低,可以更高?
在子类中被重写的方法,其访问权限允许大于但不允许小于被其重写的方法,例如:父类中一个受保护的实例方法(protected)在子类中可以是公共的(public)的,但不可以是私有的(private)。如果一个方法在父类中是static方法,那么在子类也必须是static方法;如果一个方法在父类中是实例方法,那么在子类中也必须是实例方法。

Super关键字:
使用super调用父类中重写的方法、访问父类中被隐藏的字段
子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。例如:

package first;
class A{
    public String name="张飞";         //添加成员变量
	public void say() {                //添加成员方法say
		System.out.println("我是父类A成员方法say");
	}
}
class B extends A{
    public String name="关羽";         //与父类中同名的字段,隐藏父类
	public void say(){                 //重写方法say
		super.say();                   //使用super关键字调用父类中的方法
		System.out.println("我是子类B成员方法say");
        System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
	}
}
public class myfirst {
	public static void main(String[] args) {
	  B b=new B();                     //创建子类的一个实例对象
	  b.say();                         //调用子类中重写的方法
	  System.out.println("子类的name名字:"+b.name);   //调用子类中的name
	}
}

运行结果为:

我是父类A成员方法say
我是子类B成员方法say
父类的name名字:张飞
子类的name名字:关羽

使用super调用父类的无参数构造方法/有参数构造方法

  • 当使用无参数的super()时,父类的无参数构造方法就会被调用;
  • 当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。

注意:

  • 如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;
  • 对父类的构造放的调用必须放在子类构造方法的第一行;
  • 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;
  • 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;
  • 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值