8.10 集训第十一天 【Java 继承与多态】

2019-08-12  本文已影响0人  草莓灵啾啾

学习内容

在创建一个对象之前的准备工作
1.构造方法
2.静态变量
3.静态方法 必须主动调用才执行
代码块:在创建之前就优先被调用
格式:修饰符{
预先执行的内容
}
A.类里面可以有多个代码块
B.执行的顺序和出现的先后顺序相同
C.尽量不要在一个类里面写多个代码块
定义一个类 可以在多个地方定义
1.单独创建一个文件管理一个类
2.直接在文件里面 类A的上下创建
3.直接在某个类A里面创建一个类
一个类A依附于另一个类B
封装
类来封装属性和方法
访问权限private public protected

继承(A extends B)
获得父类的属性和方法 并且需要添加自己的属性和方法
Java里面只能单继承 变向多继承
所有的类都是直接或者间接继承于object类
当调用子类的一个方法时 如果没有就到父类去查找
如果在子类里面需要调用父类的方法或者显示使用父类的属性 使用super
什么情况下需要在一个父类里面调用super的对应方法?
格式:
public void walk(){
super.walk(); }
如果一个方法需要完成一个功能 又不能单独完成 必须要父类作相应的工作
1.父类做完以后,子类在再操作
2.子类做点事情以后再调用父类去操作

如果子类里面需要重新实现父类的方法 就需要重写@override

如果父类有自定义构造方法 子类的构造方法里必须显示调用父类的构造方法
如果父类有内部类 子类中有同名的内部类 父类的内部类就被屏蔽了
如果非要使用父类中的内部类 只能使用全名类 Personal.

多态polymorphic
1.同一个方法在不同的子类中有不同(多种)的实现
2.如果有继承关系:子类的对象可以使用父类变量接收(类型的自动向上转换)

实际操作

package day11;

import java.util.ArrayList;

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

    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    public void walk(){
        System.out.println("走");

    }
    public  void eat(){
System.out.println("喝");
    }
}
class CivilServant extends Person{
    private int salary;
    private int count;



    public CivilServant(String name, int age, int salary,int count) {
        super(name, age);
        this.salary = salary;
        this.count=count;}

        @Override
        public  void walk(){
            System.out.println("慢慢走");
        }
        @Override
        public void eat(){
            System.out.println("大吃大喝");
        }


    public void cShow(){
        System.out.println("CivilServant{"+"name="+name+'\'' + ", age=" + age +
                ", salary=" + salary +
                ", count=" + count + '}');
}
}

class Worker extends Person{
    private  int salary;
    private String tec;
    public Worker(String name,int age,int salary,String tec){
super(name,age);
this.salary=salary;
this.tec=tec;
    }
    @Override
    public void walk(){
        System.out.println("快跑");
    }
    @Override
    public void eat(){
        System.out.println("快吃");
    }
    public void wShow() {
        System.out.println( "Worker{" +
            "name='" + name + '\'' + ", age=" + age +
            ", salary=" + salary +
            ", tec='" + tec + '\'' +
            '}'); }
}
class Test3{
    public  static  void main(String[] args){

        ArrayList<Person> peoples=new ArrayList<>();

        Person c1=new CivilServant("xw",30,5000,31);
        Person c2=new CivilServant("xs",32,7000,31);
        Person c3=new CivilServant("xa",35,3000,33);

        peoples.add(c1);
        peoples.add(c2);
        peoples.add(c3);

        Person w1 =new Worker("Jack",23,4556,"Android开发");
        Person w2 =new Worker("Rose",24,5665,"iOS开发");
        Person w3 =new Worker("May",29,6757,"web开发");

        peoples.add(w1);
        peoples.add(w2);
        peoples.add(w3);

        for (Person p: peoples){ //找到p到底是哪个类型的对象
            if(p instanceof CivilServant){ //公务员
                CivilServant c = (CivilServant)p;
                c.cShow();
                c.walk();
                c.eat();
            }
            else{ //员⼯
                Worker w = (Worker)p; w.wShow();
                w.walk();
                w.eat();
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读