继承

继承

继承关系中的特点:

1、子类可以拥有父类的内容。

2、子类还可以拥有自己的专有内容。

继承解决的问题:共性抽取

在继承的关系中,“子类就是一个父类”,也就是说,子类可以被当做其他类的父类来看待

继承的格式(一个普通类的定义):

父类A

public class A{
    
} 

子类B继承A

public class B extends A{
    
}

继承中成员变量的访问特点

1、直接通过子类对象访问成员变量:

在new 对象时等号左边时谁,就优先用谁,没有则向上找。

Demo:

父类:

public class A{
    int num = 10;
}

子类:

public class B extends A{
    int num = 20;
    int numB = 100;
}

实现类:

public static void main(String[] args){
   	//创建一个父类对象
    A a = new A();
    //父类对象a调用A中变量      可以
    System.out.println(a.num)		//打印结果 10
	//父类对象a调用B中变量     不可以
    
    /*
    	System.out.println(a.numB)		//错误父类不能查找子类中的变量
    */
    
    //创建一个子类对象
    B b = new B();
    System.out.println(b.num)		//打印结果 20
	System.out.println(b.numB)		//100
}

2、间接通过成员方法来访问成员变量:

该方法属于谁,则优先用谁,没有则向上找。

Demo:

父类A:

public class A{
    //A中的成员方法
    public void methodA(){
        System.out.println("A的成员方法");
    }
    public void method(){
        System.out.println("A中的method成员方法");
    }
}

子类B:

public class B extends A{
    //B中的成员方法
    public void methodB(){
        System.out.println("B的成员方法");
    }
    public void method(){
        System.out.println("B中的method成员方法");
    }
}

实现类:

public static void main(String[] args){
    //创建一个父类对象
    A a = new A();
    //创建一个子类对象
    B b = new B();
    
    //a调用本类成员方法  可以
    a.methodA();
    
    //a调用子类成员方法   不可以
    a.methodB()
        
    //子类可以调用负类的成员方法
    b.methodA();		//可以调用父类的成员方法,先在子类中查找,没找到时,再在父类中查找
    
    b.methodB();		//可以调用本类的成员方法
    
    //当子类和父类中有一个名字相同的方法时,调用时看用谁的对象来调用,用谁的对象就用谁的成员方法
    
    b.method(); 		//运行B的method方法
    
    a.method(); 		//运行A的method方法
    
}

区分子类方法中重名的三种变量:

关键字:

this :访问本类中的成员变量

super:访问父类中的成员变量

继承中成员方法的访问特点

在父子类的继承关系中,创建子类对象,访问成员方法的规则:

创建的对象是谁的,就优先用谁的成员方法,如果没有就向上找。

注意事项:

无论是成员变量还是成员方法,如果都没有都是向上找父类,绝不会向下找子类。

继承中方法的覆盖重写(override)

**概念:**在继承关系中,方法的名称一样,参数列表也一样

注意区分重载(overload): 方法的名称一样,参数列表不一样

特点:创建的是谁的对象,就优先用谁的方法。

注意事项

1、必须保证父子类之间方法名称的相同,参数列表相同。

@Overeide***】写在方法前面用来检测*是不是有效的正确覆盖重写(可以不写)。

2、子类方法返回值类型必须**【小于等于】**父类方法的返回值类型。

3、子类方法的权限修饰符必须【大于等于】父类方法的权限修饰符。

public > protected > (不写留空) > private

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

1、子类的构造方法中会默认隐含一个"***super()***"调用来执行父类的构造方法,而且位于子类构造方法的第一句。

Demo:

父类

public class Fu(){
    public Fu(){
        System.out.println("父类方法执行了!");
    }
}

子类

public calss Zi extends Fu(){
    public Zi(){
        //super();		这句话为编译器默认赠送的,可以写也可以不写
        System.out.println("子类方法执行了!");
    }
    
}

实现类

public static void main(String[] args){
    
    Zi zi = new Zi();
    //运行时先调用子类构造方法,在子类中发现super()时,跳转到父类的构造方法中执行父类的构造方法
}

运行结果:

父类方法执行了!
子类方法执行了!

2、子类可以通过**super关键字来调用父类重载构造。

***super(参数列表)***,参数列表不同会引起重载构造,和一般方法重载一样。

3、***super***的父类构造调用,必须是子类构造的第一个语句。this在调用本类方法时,也必须是方法里面的第一个语句,不能一个子类构造中调用多次***super***构造。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值