继承封装多态

Posted 洛阳泰山

tags:

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

封装

封装的概念


把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象进行操作,对不可信的类或者对象隐藏,这样的过程叫做封装。


封装的分类


对属性的封装


将属性设置为private(私有),限制其只能在类的内部使用


对方法的封装


对于方法的封装,将外部可以访问方法设置为public,将外部不能访问的方法设置为private

代码示例


//将属性和方法进行封装
public class Encapsulation 

    //成员变量设置为私有,达到属性封装的目的
    private String name;

    //为私有属性获取提供getter方法,用于获取属性值
    public String getName() 
        return name;
    
    //为私有属性获取提供setter方法,用于给属性赋值
    public void setName(String name) 
        this.name = name;
    

    //将成员方法设置为私有,达到封装的目的
    private void eat()
        System.out.println("我是一名程序员,哈哈!!!");
    

继承

什么是继承


一个新类可以从现有的类派生,这样的过程叫做继承。
那么在继承的过程中,新类被称为子类,现有的类被称为父类,子类将会继承父类的属性和行为。
 继承的语法


 [修饰符] class 子类类名 extends 父类类名 类体部分
 

代码示例

创建一个动物类(Animal)

public class Animal 

    private int age;
    private String sex;

    private void eat()
        System.out.println("吃饭!!!");
    

    private void sleep()
        System.out.println("睡觉!!!");
    

创建一个狗类(Dog),继承动物类(Animal)的属性和方法

public class Dog extends Animal
    public static void main(String[] args) 
        Dog dog=new Dog();
        dog.setAge(3);
        dog.setSex("公");
        System.out.println("狗狗今年"+dog.getAge()+"岁");
        System.out.println("狗狗性别是"+dog.getSex()+"狗");
        dog.eat();
        dog.sleep();
    

Dog类继承了Animal类,Dog类可以称为AniMal的子类,Animal类可以成为Dog里的父类。 

 子类的扩展

子类除了可以拥有父类非私有的属性和方法外,也可以扩展自己的属性和方法

代码示例

public class Dog extends Animal

    private String name;

    public void  shout()
        System.out.println("汪汪汪汪!!!");
    

    public static void main(String[] args) 
        Dog dog=new Dog();
        //private修饰变量和方法的可以直接在内部调用
        dog.name="旺财";
        System.out.println(dog.name);
        dog.shout();
    
  • Java中的继承是单继承,也就是一个类只能有一个父类。
  • 如果一个类没有显式的继承某一个类,那么它有一个默认的父类是java.lang.Object类
  • Java继承了父类非私有的成员变量和成语方法,但是请注意:子类是无法继承父类的构造方法的

方法的重写

重写 override   overload
子类从父类继承的某个实例方法无法满足子类的功能需要时,需要在子类中对该实例方法进行重新实现,这样的过程称为重写,也叫做覆写。
方法重写的要求
子类重写方法的访问修饰范围必须大于或者等于父类对应方法的访问修饰符范围
除修饰符外,重写方法的其他部分必须和父类保持一致


 super关键字

 super代表的是父类对象

 super的使用方式

 super.属性名 用于在子类中调用父类被隐藏的同名实例变量

代码示例


public class SuperClass 

    int num=20;

    //static 修饰内部类 可以被外部访问
    static class SubClass extends SuperClass
        int num=30;

        public void  speak()
            System.out.println(super.num);
            System.out.println(num);
        

    


    public static void main(String[] args) 
        SubClass subClass=new SubClass();
        subClass.speak();
    


 super([参数列表]) 用于在子类的构造方法中调用父类的构造方法

 代码示例



public class SuperClass 

    public SuperClass()
        System.out.println("父SuperClass的无参构造器");
    

    public void  speak()
        System.out.println("我是父类!!!");
    

    //static 修饰内部类 可以被外部访问
    static class SubClass extends SuperClass
        int num=30;

        public SubClass()
            super(); //可以不写,默认就有
            System.out.println("子SubClass的无参构造器");
        
        public void  speak()
            super.speak();
            System.out.println("我是子类!!!");
        

    


    public static void main(String[] args) 
        SubClass subClass=new SubClass();
        subClass.speak();
    

  • 每一个子类的构造方法在没有显示调用super()系统都会提供一个默认的super()
  •  super() 书写在第一行
  •  可以在子类构造方法中显示调用super(),完成对特定父类构造方法的调用

 

多态

什么是多态


多态顾名思义即为多种形态的意思
Java中多态的含义
发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息
子类对象的引用赋值给父类引用变量来实现动态的方法调用
Java中形成多态的前提

  • 继承
  • 重写
  • 向上转型

 代码示例

动物类

public class Animal 

    public void eat()
        System.out.println("吃饭!!!");
    


狗类 


public class Dog extends Animal
    //重写父类方法
    public void  eat()
        System.out.println("吃骨头!!!");
    

猫类 

public class Cat extends Animal
    //重写父类方法
    public void  eat()
        System.out.println("吃鱼!!!");
    

 多态测试类


public class MixinsTest 

    //多态(多种声明对象形式)
    public static void main(String[] args) 
        Animal dog=new Dog();
        Animal cat=new Cat();
        dog.eat();
        cat.eat();

    

输出结果

多态的作用

  • 提高代码的可重用性
  • 降低模块之间的耦合度

作业

作业一:
设计一个形状类Shape,方法:求周长和求面积
形状类的子类:Rect(矩形),Circle(圆形)
 Rect类的子类:Square(正方形)
 不同的子类会有不同的计算周长和面积的方法
作业二:
某公司的雇员分为以下若干类:
Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。方法:double getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。
SalariedEmployee:Employeoe的子类,拿固定工资的员工。属性:月薪
HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。属性:每小时的工资、每月工作的小时数
SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。属性:月销售额、提成率
BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。属性:底薪。
 

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

面向对象三大特性:封装,继承,多态

Java基础——面向对象三大特征(继承封装多态)

浅谈面向对象之封装继承多态!如何使用内部类模拟多继承

封装继承多态

Java面向对象一(封装 继承 多态 类 对象 方法)

JavaSE——:封装继承多态