面向对象(二):继承、this和super关键字的使用

一(继承)

继承的含义:就是抽取子类的共性,子类继承父类,就具备了父类的非私有属性和行为

实现继承的语法格式:通过extends关键字实现,格式: class 子类 extends 父类

注意:类与类之间只能实现单继承,就例如:你只能有一个亲生父亲一样!!!

继承的好处:
      1.提高了代码的复用性(多个类里边,如果有相同的成员变量或方法,则可以将这些相同的放             到同一个类中,该类就是父类,子类再使用extends继承该父类即可)
      2.提高了代码的维护性(如果方法的代码需要修改,只需要去父类中修改方法即可)
继承的弊端:
      继承让类与类之间产生父子关系,当父类发生变化时,子类实现也不得不跟着改变,
      削弱了子类的独立性

继承中的成员访问的特点
1.继承中成员变量访问的特点:
        在子类方法中访问一个变量,采用的是就近原则
         1.1子类局部范围找
         1.2子类成员范围找
         1.3父类成员范围找
         1.4如果上述三个都没有则报错(不考虑父类的父类)

package day09;

public class Demo1 {
    public static void main(String[] args) {
        B b=new  B();
        b.test();//输出的是test方法中的局部变量int age=40;
        b.show();

        //当子类方法与父类方法相同时:sayHi在子类父类中都定义了
        b.sayHi(); //b是子对象,sayHi方法最终调用的是子类的方法
        A a=new A();
        a.sayHi();//a是父对象,sayHi方法最终调用的是父类的方法

        // b.hello();???b中没有这个方法,a中也没有这个方法,所以报错!
    }
}
class A{
    int age=20;
    public void show(){
        System.out.println("A的show方法");
    }
    public void sayHi(){
        System.out.println("A的sayHi方法");
    }
}
class B extends A{
    int age=30;
    public void test(){
        int  age=40;
        System.out.println(age);
    }
    @Override
    public void sayHi(){
        System.out.println("B的sayHi方法");
    }
}


2.继承中成员方法访问的特点:
      通过子类对象访问一个方法
            2.1子类成员范围找
            2.2父类成员范围找
            2.3如果上述都没有则报错(不考虑父类的父类)

3.继承中构造方法的访问特点:

3.1当类中没有手动添加构造方法的时候,自动生成一个无参构造;若手动添加了构造方法,则不会默认生成无参构造。

3.2在创建子类对象时,需要调用父类的构造方法
(1.父类的构造方法用来初始化父类的成员变量。2.子类可以使用父类的成员变量,所以需要调用父类的构造方法)。

3.3子类中如果没有手动添加调用父类的哪个构造,默认调用的父类的无参构造
    方法1.在父类中给自己提供一个无参构造(最优!!!)
    方法2.通过使用super关键字去调用父类的有参构造

4.什么时候用继承?(继承的好处)
                                在开发中,通常,如果多种类型具有共同的属性和方法时,我们可以将这些
                                属性和方法抽离出来形成一个父类。然后让这些类型去继承这个父类
                                所有的子类,可以在父类的基础上进行扩展,相当于是父类的延伸                
当父类和子类有相同的方法时,会将父类的方法覆盖掉,不会执行父类的方法,会执行自己的方法(方法的覆盖|方法的重写)
属性可以被继承: 如果定义一个和父类同名的属性,那么在调用的时候,是自己的属性,而不是父类的;若没有自己的属性,则直接使用老爸的.
方法也可以被继承: 如果定义一个和父类同名的方法,那么在调用的时候,是自己的方法,而不是父类的;若没有自己的方法,则直接使用老爸的.
5. 构造器是不能继承的!!!!!!!!!!!!!!!!!!

二(   super和this关键字)

2.1 this和super的意义

this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象的引用)

2.2this和super的使用:

成员变量:
            this.变量名-----表示访问本类的成员变量
            super.变量名----表示访问父类的成员变量
成员方法:
            this.方法名----表示访问本类的成员方法
            super.方法名----表示访问父类的成员方法
 构造方法:
            this(有参写参) ---访问本类的构造方法
            super(有参写参)---访问父类的构造方法

注意:当成员变量的名字与局部变量的名字冲突,则使用this关键字来区分成员变量和局部变量。            变量名没有冲突,则不需考虑加this super。

         在创建子类对象时,都会默认先调用父类的无参构造器。在子类的所有构造器的第一行默             认的都会有super(); 

         当在子类中需要调用父类的属性和方法时,可以使用super关键字

package day09;

public class Demo3{
    public static void main(String[] args) {
        Eoo e=new Eoo() ;
        e.test();
    }
}
class Foo{
    String name="波多野结衣";
    int age=20;//成员变量
    public Foo(){
        this("",0);//调用当前类的传两个参的构造方法
    }
    public Foo(String name,int age){//这里的age name是局部变量
        //当成员变量的名字与局部变量的名字冲突了
        //则使用this关键字来区分成员变量和局部变量
        //this.成员变量---访问本类成员变量
        //成员变量name=局部变量name
        this.name=name;
        //成员变量age=局部变量age
        this.age=age;
    }
    public void sayHi(){
        System.out.println("Foo的sayHi");
    }
}
class Eoo extends Foo{
    int age=30;
    public Eoo(){
        super("",10);//调用父类的传两个参的构造
    }

    
    public void test(){
        int age=40;
        /*
        变量名冲突,才需要通过this super来区分不同地方的变量
         */
        System.out.println("局部变量age"+age);//输出的局部变量age=40
        System.out.println("Eoo的成员变量age"+this.age);//输出的是当前类的成员变量age=30
        System.out.println("Foo的成员变量age"+super.age);//输出的是父类的成员变量age=20
        //变量名没有冲突,则不需考虑加this super
        System.out.println("Foo的成员变量name:"+name);

        //方法命名冲突情况下需要加this和super做区分
        System.out.println("this.sayHi()");
        this.sayHi();//表示访问本类的成员方法
        System.out.println("super.sayHi()");
        super.sayHi();//表示访问父类的成员方法
    }
    @Override
    public void sayHi(){
        System.out.println("Eoo的sayHi");
    }

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值