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博客༺ཌ༈君☠纤༈ད༻同步发布

posted @ 2020-03-08 20:49  ༺ཌ༈君☠纤༈ད༻  阅读(479)  评论(0编辑  收藏  举报