关于继承

关于继承

组合继承:构造函数+原型对象模拟实现继承

call()

调用这个函数,并且修改函数运行的时this指向
fun.call(thisArg,arg1,arg2,…)

  • thisArg:当前调用函数this的指向对象
  • arg1,arg2:传递的其它参数
function fn(x,y){
     console.log('我要早起‘);
     }

var 0={
             name:'andy'
           };
  //1.call()可以调用函数
  fn.call();
  //2.call ()可以改变这个函数的this指向
  fn.call(o,1,2);

借用父构造函数继承属性

functon Father(uname,age,){
       //this指向父构造函数的对象实例
       this.uname=uname;
       this.age=age;
       }

function Son(uname,age,score){
        //this指向子构造函数的对象实例
        Father.call(this,uname,age,);
        this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);

Father.call调用父构造函数,同时要让父构造函数中的this指向我们的子构造函数(因为这句代码写在子构造函数里面,子构造函数里的this就指向子构造函数里面的实例),加入属性就可以使用。

利用原型对象继承方法

functon Father(uname,age,){
       //this指向父构造函数的对象实例
       this.uname=uname;
       this.age=age;
       }
Father.prototype.money=function(){
            console.log('100');
            };

function Son(uname,age,score){
        //this指向子构造函数的对象实例
        Father.call(this,uname,age,);
        this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);

在这里插入图片描述
我们给父构造函数写了一个方法,但是这个方法保存在原型对象中,所以子构造函数不能调用这个方法。
在这里我们也不能在子构造函数中添加Son.prototype=Father.prototype
这样我们的子构造函数虽然可以获得父构造函数的方法,但是Son原型对象也指向了Father原型对象,会将其覆盖掉,假如儿子要考试,则父亲也要考试,就是修改了子原型对象的话,父原型对象也会跟着一起变化。

子构造函数的专门方法

Son.prototype.constructor=Son;
Son.prototype=new Father();
在这里插入图片描述
这里需要注意的是,new Father是一个实例对象,它会覆盖掉原来原来的Son prototype,此时的Son prototype里面没有constructor了,这里需要给它指回去。
如果利用对象的形式来修改原型对象,要利用constructor指回原来的构造函数。

在Java中,继承和方法重写是实现多态的关键特性。首先,我们来看一下如何通过继承创建一个基础类,并在其子类中重写方法。 ```java // 定义一个基类 Animal class Animal { // 普通方法,可以被所有动物实例共享的行为 void eat() { System.out.println("Animal is eating"); } } // 子类 Dog,从 Animal 类继承并重写 eat 方法 class Dog extends Animal { // 方法重写,Dog 版本的 eat 方法 @Override void eat() { System.out.println("Dog is eating with a bone"); } } public class Main { public static void main(String[] args) { // 创建 Animal 类型的对象,实际上是 Dog 的实例 Animal animal = new Dog(); // 调用 eat 方法,因为多态,会执行 Dog 类的 eat 实现 animal.eat(); // 输出 "Dog is eating with a bone" // 显示继承和多态的好处,比如统一处理动物吃的行为,而不需要关心具体的种类 animal = new Cat(); // 假设有一个同样继承自 Animal 的 Cat 类 animal.eat(); // 这里也会调用 Dog 或 Cat 中的具体实现,但代码只需处理 Animal 对象即可 } } ``` 在这个例子中: 1. `eat` 方法在基类 `Animal` 中声明,表示所有动物都有吃的能力。 2. 子类 `Dog` 继承了 `Animal` 并重写了 `eat` 方法,提供了特定于狗的吃的方式。 3. 在 `main` 函数中,虽然我们创建的是 `Dog` 对象,但由于多态,当我们使用 `animal` 引用调用 `eat` 时,实际执行的是 `Dog` 类的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值