java基础回顾

一篇文章说明白继承、封装、多态

2020-01-26  本文已影响0人  IT楠老师

  某公园出台新政策不让宠物狗进入园区,需要立一个牌子,那牌子上写的绝对是“宠物狗禁止入内”,而不是“泰迪不能入内”,更不应该是“张三家的那条棕色的会打滚的泰迪不得入内”。

  如果我们将宠物狗理解成为一种事物,那它既可以是泰迪,也可以是阿拉斯加,他一样可以是“张三家的那条棕色的会打滚的泰迪”。

  我们进行一次归纳,首先肯定的是“张三家的那条棕色的会打滚的泰迪”是泰迪,当然泰迪也是狗,对吧!这些东西本应就是理所应当,谁都知道的事情。而在我们java的世界里恰恰正是利用这种简单的思想把面向对象使用的极其灵活。在java里泰迪是“张三家的那条棕色的会打滚的泰迪”的父类,狗是泰迪的父类,反之我们称之为子类。众所周知,“张三家的那条棕色的会打滚的泰迪”他一定拥有泰迪这个品种所共有的的特征和能力,而泰迪一样拥有狗这种事物所共有的能力和特征。

总结一下:

1、子类拥有父类一切的特征和能力,我们将这种情况称之为继承。

举例:

  宠物狗能汪汪叫,泰迪一定也能。

public class Dog {
    //名字
    private String name = "狗";
    //狗叫
    public void bark(){
        System.out.println("【"+ this.name + "】在汪汪汪叫");
    }

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

//定义泰迪
public class Teddy extends Dog {
    //玩耍
    public void play(){
        System.out.println("【"+ getName() + "】会打滚!!");
    }
}

public class Test {
    public static void main(String[] args) {
        Teddy teddy = new Teddy();
        //以下两个方法泰迪都没有,但是父类有,他拥有父类的一切,所以他能调用
        //也可以这么说,有一哥们问你借钱,你发现自己没有,于是说我看看我爸有没有,有的话借给你
        teddy.setName("小黑");
        teddy.bark();
        //除了父类的方法,泰迪还能有自己的特有的方法
        teddy.play();
    }
}

结果:
【小黑】在汪汪汪叫
【小黑】会打滚!!

但是泰迪的叫可能又和一般的狗都不一样,不一样怎么办,我们就要把狗的叫声重新实现一下,这叫个过程叫重写,重写是重写父类的方法,是使他拥有和父类名字一样,实现不一样的方法,那么以后调用条件的叫的方法时就是泰迪叫,而非狗叫。

public class Teddy extends Dog {
    @Override
    public void bark(){
          System.out.println("【"+ this.name + "】在泰迪叫");
    }
}

2、因为子类拥有父类一切的能力,子类就能当父类用,你定义一个父类,就能使用一个子类的实例去帮助他完成工作(父类引用指向子类对象),反之不可以。多种子类使用不同的实现方式完成同一种功能时,叫做多态。也就是不同的子类调用相同的方法产生不同的结果,就叫做多态。

思考:我这么说,有条金毛犬(new 出来的)即是金毛犬类,又是狗类对不对。
既然我金毛犬类的引用可以指向这个实例,因为这个实例就是金毛。
那狗类的引用当然能指向这个实例,因为这个实例就是个狗。
反之不然。

举例:
public class Cibotium extends Dog {
     @Override
    public void bark(){
          System.out.println("【"+ this.name + "】在金毛叫");
    }
}

public static void main(String[] args) {
    //大概的意思就是子类泰迪能当成狗来用
    Dog dog = new Teddy();          //父类引用指向子类对象
    dog.setName("小泰迪");
    dog.bark();
    //大概的意思就是子类金毛能当成狗来用
    Dog dog1 = new Cibotium();
    dog1.setName("小金毛");
    dog1.bark();

    //两种狗因为重写了父类的方法,导致都在叫,但是叫的方式不一样了。
}

结果:
【小泰迪】在泰迪叫
【小金毛】在金毛叫

3、面向对象还有一个重要思想,叫封装。我觉得一句话解释就是所有高级的东西都是由简单的事物封装而成。

  类就是一种封装,java里有狗吗?没有。有泰迪吗?依然没有。那我们所写的类本身就是利用基础类型,方法,以及包括其他的类共同组织打包封装而成的,所以每一个类都是一种封装。封装的目的是让事物更高级,人用起来更简单。java里没有什么就封装一个,什么类不好用就进一步封装。

例子:

  我们使用基本类型int ,引用类型String,以及方法封装一个学生类,然后使用学生加其他封装一个班级类,再使用班级类进一步封装学校类。我们可以使用班级或学校作为整体进行操作。

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

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

    public void say(String words){
        System.out.println("【" + this.name + "】说:“"+ words +"”");
    }
}

public class MyClass {

    private String myClassName;
    private List<Student> students = new ArrayList<>();

    public MyClass(String myClassName) {
        this.myClassName = myClassName;
    }

    public void play(){
        for (Student student : students) {
            student.say(myClassName+"组织的活动真好玩!");
        }
    }

    public void addStudent(Student student){
        this.students.add(student);
    }

    public List<Student> getStudents(){
        return this.students;
    }
}

public class School {

    private String schoolName;
    private List<MyClass> myClasses = new ArrayList<>();

    public School(String schoolName) {
        this.schoolName = schoolName;
    }

    //学校组织娱乐活动
    public void play(){
        for (MyClass myClass : myClasses) {
            for (Student student : myClass.getStudents()) {
                student.say(schoolName+"组织的活动真好玩!");
            }
        }
    }

    public void addClass(MyClass myClass){
        this.myClasses.add(myClass);
    }

    public List<MyClass> getMyClass(){
        return this.myClasses;
    }

    public int classSize(){
        return this.myClasses.size();
    }
}

public class Test {
    public static void main(String[] args) {
        Student lucy = new Student("lucy",18);
        Student jerry = new Student("Jerry",16);
        Student david = new Student("David",18);
        Student bill = new Student("Bill",14);

        MyClass myClassOne = new MyClass("一年级一班");
        MyClass myClassTwo = new MyClass("二年级二班");
        myClassOne.addStudent(lucy);
        myClassOne.addStudent(jerry);
        myClassOne.play();
        System.out.println("--------------------------------------------");
        myClassTwo.addStudent(david);
        myClassTwo.addStudent(bill);
        myClassTwo.play();
        System.out.println("--------------------------------------------");
        School school = new School("实验小学");
        school.addClass(myClassOne);
        school.addClass(myClassTwo);
        school.play();
    }
}

结果:
【lucy】说:“一年级一班组织的活动真好玩!”
【Jerry】说:“一年级一班组织的活动真好玩!”
--------------------------------------------
【David】说:“二年级二班组织的活动真好玩!”
【Bill】说:“二年级二班组织的活动真好玩!”
--------------------------------------------
【lucy】说:“实验小学组织的活动真好玩!”
【Jerry】说:“实验小学组织的活动真好玩!”
【David】说:“实验小学组织的活动真好玩!”
【Bill】说:“实验小学组织的活动真好玩!”
上一篇下一篇

猜你喜欢

热点阅读