封装、继承、重载、重写、多态

  有时候,代码写的不少,但有些术语却总是记得不太清楚;有些原理,明明经常用到,但却不太会描述。既然如此,那就记录下来,印象不深的时候再来看看。

  1.封装:把对象的属性、操作(或业务)结合为一个整体(class),并尽可能得隐藏内部实现细节,使得对数据的访问只能通过已定义的接口。

public class Person {
    private String name = "张三";

    private int age = 18;

    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 eat(){
        System.out.println("人要吃东西。");
    }

}

  上述代码中,把姓名、年龄属性和吃饭行为都封装到person类中的做法,叫做是封装。

  2.继承:从已有的类中派生出新的类,新的类能吸收已有类中的属性与方法,并能拓展新的能力。被继承的类称之为“父类”或“基类”,派生出的新类称之为该类的子类。

     重写:子类对从父类继承而来的方法进行修改,返回值和形参都不能改变(可以用注解@override来校验重写是否成功),子类重写的方法不属于新增的方法,重写又叫做覆盖。特别注意,父类的成员变量和静态变量不会被重写,仅仅会被隐藏,被隐藏的变量无法被访问。

public class Son extends Person {
    //私有属性无法被继承
    private int age = 1;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //重写父类方法
    @Override
    public void eat() {
        System.out.println(this.getAge() + "岁的儿子" + this.getName() + "说:爸爸,我饿。");
    }
}

public class Test {

    //测试方法1
    @org.junit.Test
    public void test1() throws Exception {
        Son son = new Son();
        son.eat();
    }

}

执行结果:1岁的儿子张三说:爸爸,我饿。

  上述代码中,父类name属性被子类继承,所以执行结果中,儿子也叫做张三。而eat()方法被重写,子类对象调用的是重写后的eat()方法。

  3.重载:在一个类中存在多个方法名称相同,但参数签名不同(参数的个数或者类型不同)。(修饰符、返回值类型可以相同也可以不同)

public class Reload {

    public static void reload(){
        System.out.println("无参重载方法。");
    }

    public void reload(String s){
        System.out.println("string参数重载方法。");
    }

    public void reload(String s, int i){
        System.out.println("string,int参数重载方法。");
    }

    protected String reload(int i){
        System.out.println("int参数重载方法。");
        return "";
    }
}

public class Test {

    @org.junit.Test
    public void test2() throws Exception {
        Reload reload = new Reload();
        reload.reload();
        reload.reload("");
        reload.reload("",1);
        reload.reload(1);
    }

}

执行结果:
    无参重载方法。
    string参数重载方法。
    string,int参数重载方法。
    int参数重载方法。

  4.多态:允许不同类的对象对同一消息做出响应。即同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。这也意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。

  多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。

public class Person {
    private String name = "张三";

    private int age = 18;

    public Person(){
        System.out.println("父类的无参构造器:" + this.getName() + "今年" + this.getAge() +"岁。");
        this.eat();
    }

    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 eat(){
        System.out.println("人要吃东西。");
    }

}

public class Son extends Person {
    //私有属性无法被继承,因为此变量名在父类中存在,故父类中此变量将被隐藏
    private int age = 1;

    public static String addr = "abc";

    public Son(){
        //在执行子类的构造方法之前,必定先调用父类的构造器,若无显示,则默认调用super()
        //默认:super();
        System.out.println("子类的无参构造器:" + this.getName() + "今年" + this.getAge() +"岁。");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //重写父类方法
    @Override
    public void eat() {
        System.out.println(this.getAge() + "岁的儿子" + this.getName() + "说:爸爸,我饿。");
    }
}

public class Test {
    @org.junit.Test
    public void test3() throws Exception {
        Person person = new Son();
        person.eat();

    }
}

执行结果:

  父类的无参构造器:张三今年0岁。
  0岁的儿子张三说:爸爸,我饿。
  子类的无参构造器:张三今年1岁。
  1岁的儿子张三说:爸爸,我饿。

  定义父类引用指向子类对象,在创建子类对象时,步骤:

1首先会隐式调用父类无参构造器,于是先打印了“父类的无参构造器:张三今年0岁”。而为何是0岁而不是18岁的原因,是子类中存在age变量与父类同名,故父类的age变量被隐藏。2而在父类构造器中调用了this.eat(),实际调用的还是子类重写后的方法(毕竟调用对象都是子类对象,仅仅引用类型为父类而已),3接着super()构造器执行完成(作用是初始化父类变量和方法等),开始执行子类构造器(先初始化子类变量),4调用子类eat()方法。

原文地址:https://www.cnblogs.com/wangxiaotiao/p/8531919.html

时间: 2024-10-25 22:29:21

封装、继承、重载、重写、多态的相关文章

C++基础6 【继承】 类型兼容 satatic 多继承 虚继承 【多态】 案例 虚析构函数 重载重写重定义

[继承] 继承的访问控制域 图 类型兼容性原则  指针 与 引用 用子类直接初始化父类 类的继承模型示意 图 [继承结论] [非常重要的概念] 继承与组合混搭情况下,构造和析构调用原则 原则:先构造父类,再构造成员变量.最后构造自己 先析构自己,在析构成员变量.最后析构父类 继承中,同名的成员变量的处理办法 继承中,同名的成员函数的处理办法 派生类中的static关键字 如果静态成员变量,你没有使用,也没有初始化的话 编译不会报错 经典错误 : 类中函数默认是private的,无法在外部访问 具

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

JAVA 重写&重载/多态/抽象类/封装/接口/包

重写&重载 重写(override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重载(overloading) 是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 多态 多态就是同一个接口,使用不同的实例而执行不同操作 现实中,比如我们按下 F1 键这个动作: 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档: 如果当前在 Word 下弹出的就是 Word 帮助: 在 Windows 下弹出的就是 Win

Java多态机制和继承中重写重载

关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上

重载,继承,重写和多态的区别

重载,继承,重写和多态的区别 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员, 2)重写是继承后重新实现父类的方法. 3)重载是在一个类里一系列参数不同名字相同的方法. 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法. 下面的例子包含了这四种实现: class Triangle extends Shape { public int getSides() {  return 3; }} c

重写,重载,多态,继承的区别。

重写,重载,多态,继承的区别: 继承是子类继承父类的方法: 重写(override)是子类重写父类允许访问的方法.返回值和参数类型必须相同. 重载(overload)就是允许多个同名但是形参个数或者类型不同的函数方法存在于同一个类里.当类统一调用方式时由形参来决定调用具体的方法. 下面是转载的一篇文章: 继承是子类获得父类的成员,重写是继承后重新实现父类的方法.重载是在一个类里一系列参数不同名字相同的方法.多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sle

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面

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

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get