Inheritance and polymorphism-java basic learning

Inheritance overview

package extendsBase;
/***继承概述
*  继承中子类的特点:
 *      子类可以有父类的内容
 *      子类还可以有自己特有的内容
* 继承的好处和弊端
 *  继承好处
 *      提高了代码的复用性(多个类相同的成员可以放到同一个类中)提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
 * 继承弊端
 *      继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
 * 什么时候使用继承?
 *      继承体现的关系: isa
 *      假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承
 *      举例:苹果和水果,猫和动物,猫和狗
 * */
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Fu f =new Fu();
        f.show();

        Zi z = new Zi();
        z.method();
        z.show();
    }
}
package extendsBase;

public class Fu {
    
    
    public void show(){
    
    
        System.out.println("show方法被调用");
    }
}

Use of super

package superStudy;
/***
*
this关键字指向调用该方法的对象
    一般我们是在当前类中使用this关键字,所以我们常说this代表本类对象的引用
super
    super关键字的用法和this关键字的用法相似.
    this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)

* */
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Zi z = new Zi();
        z.show();
    }
}
package superStudy;

public class Fu {
    
    
    public int age = 40;
}
package superStudy;

public class Zi extends Fu{
    
    
    public int age = 20;

    public void show(){
    
    
        int age = 30;
        System.out.println(age);
        //访问本类的成员变量
        System.out.println(this.age);
        //访问父类的成员变量
        System.out.println(super.age);
    }
}
package extendsBase;

public class Zi extends Fu {
    
    
    public void method(){
    
    
        System.out.println("method方法被调用");
    }
}

Method rewriting

package extendsMethodRe;
/****方法重写
    方法重写概述
        子类中出现了和父类中一模一样的方法声明
    方法重写的应用
        当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
    练习:手机类和新手机类
    @Override
        是一个注解(注解后面会学习到)
        可以帮助我们检查重写方法的方法声明的正确性
* */
public class PhoneDemo {
    
    
    public static void main(String[] args) {
    
    
        Phone p = new Phone();
        p.call("林青霞");
        System.out.println("-----------------");

        NewPhone np = new NewPhone();
        np.call("林青霞");
    }
}
package extendsMethodRe;

public class Phone {
    
    
    public void call(String name){
    
    
        System.out.println("给"+name+"打电话");
    }
}
package extendsMethodRe;

public class NewPhone extends Phone{
    
    
    /*
    public void call(String name){
        System.out.println("开启视频功能");
        //System.out.println("给" + name + "打电话");
        super.call(name);
    }
    */
    @Override
    public void call(String name){
    
    
        System.out.println("开启视频功能");
        //System.out.println("给" + name + "打电话");
        super.call(name);
    }
}

Method rewrite considerations

/***
 * 方法重写注意事项
 *      私有方法不能被重写(父类私有成员子类是不能继承的)
 *      子类方法访问权限不能更低(public > 默认>私有)
*
* */
public class Zi extends Fu {
    
    
    /*因为show是private类型的所以不能重写
    @Override
    private void show(){
        System.out.println("Zi中show()方法被调用");
    }
    */
     @Override
    void method(){
    
    
         System.out.println("Zi中method()方法被调用");
     }
}

Access characteristics of variables in inheritance

package extendsMakeFind;
/*
* 继承中变量的访问特点
    在子类方法中访问一个变量
    子类局部范围找
    子类成员范围找父类成员范围找
    如果都没有就报错(不考虑父亲的父亲.….)

*
* */
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Zi z = new Zi();
        z.show();//20 175
    }
}
package extendsMakeFind;

public class Fu {
    
    
    public int age = 40;
}
package extendsMakeFind;

public class Zi extends Fu{
    
    
    public int height = 175;
    public int age = 20;

    public void show(){
    
    
        int age = 40;
        System.out.println(age);
        System.out.println(height);
    }
}

Access characteristics of construction methods in inheritance

package myExtends;
/***继承中构造方法的访问特点***
 ****子类中所有的构造方法默认都会访问父类中无参的构造方法,为什么呢?
 *      因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化;
 *      每一个子类构造方法的第一条语句默认都是: super()
 ****如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
 *      通过使用super关键字去显示的调用父类的带参构造方法;
 *      在父类中自己提供一个无参构造方法
 *      推荐:自己给出无参构造方法
 *
* */
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Zi z1 = new Zi();//Fu中无参数构造方法被调用
                        //Zi中无参数构造方法被调用
        Zi z2 = new Zi(20);//Fu中无参数构造方法被调用
                                //Zi中带参数构造方法被调用
    }
}
package myExtends;

public class Fu {
    
    
    /*public Fu(){
        System.out.println("Fu中无参数构造方法被调用");
    }*/
    public Fu(){
    
    }
    public Fu(int age){
    
    
        System.out.println("Fu中带参数构造方法被调用");
    }
}
package myExtends;

public class Zi extends Fu{
    
    
    public Zi(){
    
    
        //super();
        //super(20);
        System.out.println("Zi中无参数构造方法被调用");
    }
    public Zi(int age){
    
    
        //super();
        //super(20);
        System.out.println("Zi中带参数构造方法被调用");
    }
}

Access characteristics of member methods in inheritance

package extendsmMethodFind;
/**
 * 继承中成员方法的访问特点
 *      通过子类对象访问一个方法
 *      子类成员范围找
 *      父类成员范围找
 *      如果都没有就报错(不考虑父亲的父亲...)
 * **/
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Zi z = new Zi();
        z.method();
        z.show();
    }
}
package extendsmMethodFind;

public class Fu {
    
    
    public void show(){
    
    
        System.out.println("Fu中show()方法被调用");
    }
}
package extendsmMethodFind;

public class Zi extends Fu{
    
    
    public void method(){
    
    
        System.out.println("Zi中method()方法被调用");
    }
    public void show(){
    
    
        System.out.println("Zi中show()方法被调用");
    }
}
public class Fu {
    
    
    private void show(){
    
    
        System.out.println("Fu中show()方法被调用");
    }
    /*
    public void method(){
        System.out.println("Fu中method()方法被调用");
    }
    */
    void method(){
    
    
        System.out.println("Fu中method()方法被调用");
    }
}

Notes on inheritance

/***
 * Java中继承的注意事项
        Java中类只支持单继承,不支持多继承
        Java中类支持多层继承

 *
*
* */
//public class Son extends Father, Mother {
    
    
//
//}
public class Son extends Father{
    
    

}
public class Mother {
    
    
    public void dance(){
    
    
        System.out.println("妈妈爱跳舞");
    }
}
public class Granddad {
    
    
    public void drink(){
    
    
        System.out.println("爷爷爱喝酒");
    }
}
public class Father extends Granddad{
    
    
    public void smoke(){
    
    
        System.out.println("爸爸爱抽烟");
    }
}

Example: teacher and student

General code

package itheima09;

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Teacher t1 = new Teacher();
        t1.setName("林青霞");
        t1.setAge(30);
        System.out.println(t1.getName()+","+t1.getAge());
        t1.teach();

        Teacher t2 = new Teacher("风清扬", 33);
        System.out.println(t2.getName()+","+t2.getAge());
        t2.teach();
    }
}
public class Student {
    
    
    private String name;
    private int age;
    public Student(){
    
    

    }
    public Student(String name, int age){
    
    
        this.name = name;
        this.age = age;
    }
    public String getName(){
    
    
        return name;
    }
    public void setName(String name){
    
    
        this.name = name;
    }
    public int getAge(){
    
    
        return age;
    }
    public void setAge(int age){
    
    
        this.age = age;
    }
    public void study(){
    
    
        System.out.println("好好学习,天天向上");
    }
}
public class Teacher {
    
    
    private String name;
    private int age;
    public Teacher(){
    
    

    }
    public Teacher(String name, int age){
    
    
        this.name = name;
        this.age = age;
    }
    public String getName(){
    
    
        return name;
    }
    public void setName(String name){
    
    
        this.name = name;
    }
    public int getAge(){
    
    
        return age;
    }
    public void setAge(int age){
    
    
        this.age = age;
    }
    public void teach(){
    
    
        System.out.println("用爱成就每一位学员");
    }
}

Use inherited code

public class Person {
    
    
    private String name;
    private int age;

    public Person() {
    
    
    }

    public Person(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}
public class PersonDemo {
    
    
    public static void main(String[] args) {
    
    
        //创建老师类对象并进行测试
        Teacher t1 = new Teacher();
        t1.setName("林青霞");
        t1.setAge(30);
        System.out.println(t1.getName() + "," + t1.getAge());
        t1.teach();

        Teacher t2 = new Teacher("风清扬", 33);
        System.out.println(t2.getName()+","+t2.getAge());
        t2.teach();
    }
}
public class Student {
    
    
    public void study(){
    
    
        System.out.println("好好学习,天天向上");
    }
}
public class Teacher extends Person{
    
    
    public Teacher(){
    
    

    }
    public Teacher(String name, int age){
    
    
        //this.name = name;
        // this.age = age;
        super(name, age);
    }
    public void teach(){
    
    
        System.out.println("用爱成就每一位学员");
    }
}

Guess you like

Origin blog.csdn.net/weixin_42137874/article/details/115103671