JavaSE12-封装继承和多态

Posted 擦镜子的默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE12-封装继承和多态相关的知识,希望对你有一定的参考价值。

一、封装

  • 封装(信息隐藏):通常,应禁止直接访问一个对象中数据的实际表示,应通过操作接口来访问
  • 程序设计追求“高内聚,低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
  • 属性私有,get/set

创建一个Student类

public class Student 

    //属性私有,无法直接操作这些属性
    private String name;
    private int age;
    private char sex;
    private int id;

    //set/get是提供给外部操作这些属性的方法,
    //alt+insert ---》生成 getter和setter 可以根据属性自动生成set/get方法
    public String getName() 
        return name;
    

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

    public int getAge() 
        return age;
    

    //安全检查,设置默认值
    public void setAge(int age) 
        if(age<0 || age>150)
            this.age = -1;
        else
            this.age = age;
        

    

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public char getSex() 
        return sex;
    

    public void setSex(char sex) 
        this.sex = sex;
    

主程序类Application

public class Application 
    public static void main(String[] args) 
        Student s1 = new Student();
        System.out.println(s1.getName());  //null
        s1.setName("zhangsan");
        System.out.println(s1.getName());   //zhangsan

        s1.setAge(70);
        System.out.println(s1.getAge());  //70
        s1.setAge(180);
        System.out.println(s1.getAge());  //-1

    

最后,我们简单描述下封装的作用

  • 隐藏代码的实现细节
  • 提高程序的安全性
  • 统一接口
  • 增加系统的可维护性

扩展:修饰符 public>protected>default>private

二、继承

  • 继承是类与类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合和聚合等
  • 继承关系的两个类,一个叫做父类(基类),另一个叫做子类(派生类)。每个父类可以有多个子类,但每个子类只能继承一个父类。比如,人类是一个父类,男人类和女人类是继承于人类的子类。
  • 继承使用关键字 “extends
  • super重写
  • 所有类都直接或者间接的默认继承于Object类

首先定义一个Person类

//父类
public class Person 

    public int money = 1_0000;
    public void say()
        System.out.println("说话");
    

然后,定义一个Student类,继承于Person类

//子类,继承父类的所有方法和属性
public class Student extends Person

最后,主程序类Application

public class Application 
    public static void main(String[] args) 
        Student s1 = new Student();
        s1.say();  //说话
        System.out.println(s1.money);  //10000
    

这里父类中的属性是public,但一般的情况下应该设置为private(封装),所以我们要进行一下修改

Person类


public class Person 

    //public int money = 1_0000;
    //若设置为private,子类不能直接操作该属性,但可以通过set/set方法进行操作
    private int money = 1_0000;

    public void say()
        System.out.println("说话");
    

    public int getMoney() 
        return money;
    

    public void setMoney(int money) 
        this.money = money;
    

主程序类

public class Application 
    public static void main(String[] args) 
        Student s1 = new Student();
        s1.say();  //说话
//        System.out.println(s1.money);  //10000
        System.out.println(s1.getMoney());  //10000
    

super

  • super和this用于区别子类和父类中的同名的属性和方法

Person类

//父类
public class Person 
    public String name = "zhangsan";

    public void print()
        System.out.println("person");
    

Student类

//子类
public class Student extends Person 

    private String name = "lisi";
    public void print()
        System.out.println("student");
    

    public void test1()
        System.out.println(name);  //lisi
        System.out.println(this.name);  //lisi
        System.out.println(super.name);  //zhangsan
    

    public void test2()
        print();  //student
        this.print();  //student
        super.print();  //person
    

主程序类

public class Application 
    public static void main(String[] args) 
        Student s1 = new Student();
        s1.test1();
        System.out.println("=======================");
        s1.test2();
    

注意点:

  • super 只能出现在子类的方法或构造方法中
  • super 调用父类的构造方法,必须在子类构造方法中的首行
  • super 和 this 不能同时调用构造方法
  • super():父类的构造;this():子类的构造

看不懂的去看原视频:B站狂神说

重写

  • 为什么重写:父类中的方法,子类不一定需要或者不一定满足
  • 重写都是方法的重写,和属性没有关系
  • 重写是多态的基础
  • static 方法不能被重写

我们先看一下非重写的情况,B类

public class B 

    public static void test()
        System.out.println("B==>test");
    


A类

public classA extends B

    public static void test()
        System.out.println("A==>test");
    

主程序类

public class Application 
    public static void main(String[] args) 

        A a = new A();
        a.test();  //A==>test

        B b = new A();
        b.test();  //B==>test
    

把static去掉,重写test方法,B类

public class B 

    public void test()
        System.out.println("B==>test");
    

A类

public class A extends B

//    public void test()
//        System.out.println("A==>test");
//    

    //重写
    @Override  //注解,有功能的注释
    public void test() 
        super.test();
    

主程序类

public class Application 
    public static void main(String[] args) 
				//方法的调用只和左边的数据类型有关(数据类型有哪些方法,该对象就有哪些方法)
        A a = new A();
        a.test();  //A==>test
        
        //父类的引用指向了子类,若子类重写了方法,执行子类的子类中的方法
        B b = new A();
        b.test();  //A==>test
    

注意点:

  • 有继承关系,子类继承父类的方法
  • 方法名必须相同,方法体不同
  • 参数列表必须相同(参数类别不同的是重载)
  • 修饰符的范围可以扩大,但不能缩小: public>protected>default>private(父类中protected的方法在子类中可以重写成public的方法)

三、多态

  • 多态:同一方法可以根据发送对象的不同而采用多种不同的行为方式
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
  • 多态是方法的多态,属性没有多态性
				//方法的调用只和左边的数据类型有关(数据类型有哪些方法,该对象就有哪些方法)
        A a = new A();
        a.test();  //A==>test
        
        //父类的引用指向了子类,若子类重写了方法,执行子类的子类中的方法
				**//b 不能调用子类中有而父类中没有的方法**
        B b = new A();
        b.test();  //A==>test

多态存在的条件:

  • 有继承关系
  • 子类重写父类的方法
  • 父类引用指向子类对象

以上是关于JavaSE12-封装继承和多态的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE/封装继承多态

JavaSE学习总结——封装,继承,多态很简单

JavaSE基础知识—面向对象(5.4面向对象三大特征:封装继承多态)

12:面向对象三大特性(封装继承多态)之继承

python篇1.12.2---继承,多态与多态性,封装

javaSE_12_方法覆盖(重写)和多态