• Java面向对象--三大基本特征之封装性和继承性


    Java面向对象的三大基本特征是:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),这三大基本特征是学习Java面向对象开发的基础和重点。本篇博客将详细介绍三大基本特征中封装性和继承性的用法。


    目录:

    ☍ 封装和隐藏

    ☍ 继承性(extends)


    ☍ 封装和隐藏

    封装的思想

    封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合。

    ☃ 我们程序设计追求“高内聚,低耦合”

      ☄ 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉

      ☄ 低耦合 :仅对外暴露少量的方法用于使用

    ☃ 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。”

    封装的原因

    ☃ 使用者对类内部定义的属性( 对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题

    信息的封装和影藏

    Java中通过将数据(属性/变量)声明为私有的(private),再提供公共的public方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

    ◌ 隐藏一个类中不需要对外提供的实现细节

    ◌ 使用者只能通过方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作

    ◌ 便于修改,增强代码的可维护性

    例子:

    class Animal{
        //定义private变量,只允许Animal类访问
        private int legs;
        //定义public类型set和get方法,允许外部类访问
        public void setLegs(int legNum){   //设置legs属性
            if(legNum!=0 && legNum!=2 && legNum!= 4){
                System.out.println("哇哦!这个动物腿的数量很不同啊。");
                return;
            }
            legs = legNum;
        }
        public int getLegs(){  //获取legs属性
            return legs;
        }
        //eat方法
        public void eat(String food){
            System.out.println("这个动物吃" + food);
        }
    }
    class Dog{
        public static void main(String args[]){
            Animal a1 = new Animal();
            a1.setLegs(4);  //正确赋值方式
            //a1.legs = 4;  错误赋值方式,legs为private权限
            System.out.println("狗有" + a1.getLegs() + "条腿");
            a1.eat("骨头");
        }
    }
    

    ➥ set和get方法只是封装性的一个体现(隐藏属性),并不能完全代表Java面向对象的封装性。

    ➥ 封装性还可以体现在方法上,只需对方法加上权限(private),使得方法只能在当前类中使用,不对外暴露私有方法

    ➥ 封装性的体现是多样的,不只是体现在某一种使用上

    四种访问权限修饰符

    Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,用来限定对象对该类成员(属性、方法、构造器、内部类,不包含代码块‘{}’)的访问权限

    修饰符 同一个类 同一个包 不同包的子 类 同一个工程(不同包,非子类)
    public
    protected
    缺省(default)
    private

    ☃ 对于class的权限修饰只可以用public和default(缺省),且一个类中只能是当前类的类名可以用public修饰

    ☃ public类可以在任意地方被访问

    ☃ default(缺省)类只可以被同一个包内部的类访问。


    ☍ 继承性(extends)

    继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类功能和属性。

    继承的目的和语法

    ☃ 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中(父类、基类or超类),那么多个类(子类or派生类)拥有与父类相同的属性和行为时无需再定义这些属性和行为,只要继承那个类即可。

    继承语法规则

    class ChildClass extends SuperClass{
    	//.....
    }
    

    继承的作用

    ☃ 继承的出现减少了代码冗余,提高了代码的复用性

    ☃ 继承的出现,更有利于功能的扩展

    ☃ 继承的出现让类与类之间产生了关系,提供了多态的前提

    ✦ 不要仅为了获取其他类中某个功能而去继承,要在面向对象的思维上去继承,如轿车不要去继承货车(即使两者拥有部分相同的属性和功能)而是继承车

    继承的原则

    ☃ 子类继承了父类,就继承了父类的方法和属性(非选择性继承)

    ☃ 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法

    ☃ 在Java中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”

    ➥ 子类不能直接访问父类中私有的(private) 的成员变量和方法,通过setter、getter方法和提供的public方法访问(实际上继承到了私有的属性和方法,但由于封装性不能直接调用)

    ➥ Java只支持单继承和多层继承,不允许多重继承

    ◌ 一个子类只能有一个父类

    ◌ 一个父类可以派生出多个子类

    ◌ 对于多层继承,父类和子类是相对的(直接继承和间接继承)

    ◌ 多层继承中,子类可以获取直接父类和间接父类(直接父类的父类)的所有属性和方法

    ☄ 除java.lang.Object类外,其他类都直接或间接继承Object类

    练习:

    定义父类Circle(圆,包含属性半径,和求圆的面积的方法),子类Cylinder(圆柱,包含高和求体积的方法)继承Circle类,在ExtendsTest类中创建Cylinder对象求圆柱的面积

    还可自行创建圆锥类等继承Circle求体积


    本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布

  • 相关阅读:
    《TD项目开发小结》
    感悟
    毕业两年了
    ip+port无法访问nginx问题
    问题解决之道
    调休9天的那些日子
    关于类加载器(ClassLoader)
    ios核心蓝牙之心率监控(swift)
    git(git-flow)的高效管理使用
    WKWebview加载本地图片时出现路径问题
  • 原文地址:https://www.cnblogs.com/asio/p/12427304.html
Copyright © 2020-2023  润新知