14.面向对象三大特征

一、封装与隐藏

package com.atguigu.java;
/*
 * 面向对象的特征一:封装与隐藏     3W:what? why? how?
 * 一、问题的引入:
 *  当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到
 *  属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值
 *  加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs())
 *  同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private).
 *  -->此时,针对于属性就体现了封装性。
 *
 * 二、封装性的体现:
 * 我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
 *
 *  拓展:封装性的体现:① 如上  ② 不对外暴露的私有的方法  ③ 单例模式   ...
 *
 *
 * 三、封装性的体现,需要权限修饰符来配合。
 * 1.Java规定的4种权限(从小到大排列):private、缺省、protected 、public
 * 2.4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
 * 3.具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
 *        修饰类的话,只能使用:缺省、public
 *
 * 总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。
 *
 */
public class AnimalTest {
    public static void main(String[] args) {

        Animal a = new Animal();
        a.name = "大黄";
//        a.age = 1;
//        a.legs = 4;//The field Animal.legs is not visible

        a.show();

//        a.legs = -4;
//        a.setLegs(6);
        a.setLegs(-6);

//        a.legs = -4;//The field Animal.legs is not visible
        a.show();

        System.out.println(a.name);

    }
}

class Animal{

    String name;
    private int age;
    private int legs;//腿的个数

    //对属性的设置
    public void setLegs(int l){
        if(l >= 0 && l % 2 == 0){
            legs = l;
        }else{
            legs = 0;
//            抛出一个异常(暂时没有讲)
        }
    }

    //对属性的获取
    public int getLegs(){
        return legs;
    }

    public void eat(){
        System.out.println("动物进食");
    }

    public void show(){
        System.out.println("name = " + name + ",age = " + age + ",legs = " + legs);
    }

    //提供关于属性age的get和set方法
    public int getAge(){
        return age;
    }
    public void setAge(int a){
        age = a;
    }

}

//private class Dog{
//
//}
package com.atguigu.java;

public class Order {

    private int orderPrivate;
    int orderDefault;
    public int orderPublic;

    private void methodPrivate(){
        orderPrivate = 1;
        orderDefault = 2;
        orderPublic = 3;
    }
    void methodDefault(){
        orderPrivate = 1;
        orderDefault = 2;
        orderPublic = 3;
    }
    public void methodPublic(){
        orderPrivate = 1;
        orderDefault = 2;
        orderPublic = 3;
    }

}
package com.atguigu.java;

public class OrderTest {
    public static void main(String[] args) {

        Order order = new Order();

        order.orderDefault = 1;
        order.orderPublic = 2;
        //出了Order类之后,私有的结构就不可以调用了
//        order.orderPrivate = 3;//The field Order.orderPrivate is not visible

        order.methodDefault();
        order.methodPublic();
        //出了Order类之后,私有的结构就不可以调用了
//        order.methodPrivate();//The method methodPrivate() from the type Order is not visible
    }
}二、面向对象的特征之二:继承性
package com.atguigu.java;
/*
 * 面向对象的特征之二:继承性    why?
 *
 * 一、继承性的好处:
 * ① 减少了代码的冗余,提高了代码的复用性
 * ② 便于功能的扩展
 * ③ 为之后多态性的使用,提供了前提
 *
 *
 * 二、继承性的格式:
 *    class A extends B{}
 *    A:子类、派生类、subclass
 *    B:父类、超类、基类、superclass
 *
 *    2.1体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。
 *        特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。
 *    只有因为封装性的影响,使得子类不能直接调用父类的结构而已。
 *    2.2 子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展。
 *    子类和父类的关系,不同于子集和集合的关系。
 *    extends:延展、扩展
 *
 * 三、Java中关于继承性的规定:
 *       1.一个类可以被多个子类继承。
 *    2.Java中类的单继承性:一个类只能有一个父类
 *    3.子父类是相对的概念。
 *    4.子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
 *    5.子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
 *
 *
 * 四、 1. 如果我们没有显式的声明一个类的父类的话,则此类继承于java.lang.Object类
 *    2. 所有的java类(除java.lang.Object类之外)都直接或间接的继承于java.lang.Object类
 *    3. 意味着,所有的java类具有java.lang.Object类声明的功能。
 */
public class ExtendsTest {
    public static void main(String[] args) {

        Person p1 = new Person();
//        p1.age = 1;
        p1.eat();
        System.out.println("*****************");

        Student s1 = new Student();
        s1.eat();
//        s1.sleep();
        s1.name = "Tom";
        s1.setAge(10);
        System.out.println(s1.getAge());

        s1.breath();

        Creature c = new Creature();
        System.out.println(c.toString());
    }
}

三、面向对象特征之三:多态性

package com.atguigu.java;

import java.util.Date;

/*
 * 面向对象特征之三:多态性
 *
 * 1.理解多态性:可以理解为一个事物的多种形态。
 * 2.何为多态性:
 *   对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
 *
 * 3. 多态的使用:虚拟方法调用
 *   有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
 *   总结:编译,看左边;运行,看右边。
 *
 * 4.多态性的使用前提:  ① 类的继承关系  ② 方法的重写
 *
 * 5.对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)
 *
 * *************************************************************
 *
 *
 */
public class PersonTest {
    public static void main(String[] args) {

        Person p1 = new Person();
        p1.eat();

        Man man = new Man();
        man.eat();
        man.age = 25;
        man.earnMoney();

        //*************************************************
        System.out.println("*******************");
        //对象的多态性:父类的引用指向子类的对象
        Person p2 = new Man();
//        Person p3 = new Woman();
        //多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 ---虚拟方法调用
        p2.eat();
        p2.walk();

//        p2.earnMoney();

        System.out.println(p2.id);//1001

        System.out.println("****************************");
        //不能调用子类所特有的方法、属性:编译时,p2是Person类型。
        p2.name = "Tom";
//        p2.earnMoney();
//        p2.isSmoking = true;
        //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致
        //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

        //如何才能调用子类特有的属性和方法?
        //向下转型:使用强制类型转换符。
        Man m1 = (Man)p2;
        m1.earnMoney();
        m1.isSmoking = true;

        //使用强转时,可能出现ClassCastException的异常。
//        Woman w1 = (Woman)p2;
//        w1.goShopping();

        /*
         * instanceof关键字的使用
         *
         * a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
         *
         *
         *  使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
         *  进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
         *
         *  如果 a instanceof A返回true,则 a instanceof B也返回true.
         *  其中,类B是类A的父类。
         */
        if(p2 instanceof Woman){
            Woman w1 = (Woman)p2;
            w1.goShopping();
            System.out.println("******Woman******");
        }

        if(p2 instanceof Man){
            Man m2 = (Man)p2;
            m2.earnMoney();
            System.out.println("******Man******");
        }

        if(p2 instanceof Person){
            System.out.println("******Person******");
        }
        if(p2 instanceof Object){
            System.out.println("******Object******");
        }

//        if(p2 instanceof String){
//
//        }

        //练习:
        //问题一:编译时通过,运行时不通过
        //举例一:
//        Person p3 = new Woman();
//        Man m3 = (Man)p3;
        //举例二:
//        Person p4 = new Person();
//        Man m4 = (Man)p4;

        //问题二:编译通过,运行时也通过
//        Object obj = new Woman();
//        Person p = (Person)obj;

        //问题三:编译不通过
//        Man m5 = new Woman();

//        String str = new Date();

//        Object o = new Date();
//        String str1 = (String)o;

    }
}

//class Order{
//
//}
 

原文地址:https://www.cnblogs.com/xingqisan/p/12114266.html

时间: 2024-10-12 01:39:23

14.面向对象三大特征的相关文章

c++面向对象三大特征封装、继承和多态知识总结

面向对象三大特征:封装,继承,多态: 一.封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现:作用是便于分工和分模块,防止不必要的扩展: 二.继承:就是一种传承,可以把父类型中的数据传承到子类中,子类除了传承了父类的数据之外,还可以对父类型进行扩展: 公开继承  public 保护继承  protected 私有继承  private 保护成员:在子类和本类中可以访问,其他不行: 1.公开继承:在公开继承下,父类型中的数据是公开的到子类型中权限是公开的:父类型中保

PHP面向对象三大特征

<?php//PHP 面向对象三大特征 封装 继承 多态 <抽象> //封装 /** * @author bin * *//* class Person{ //encapsulate private $name; private $age; //这个就好比我们Java中的get set 想spring注入的 通过通过set方法 通过构造函数 一样 public function __set($columnName,$value){ $this->columnName = $valu

JavaSE(一)面向对象三大特征、五大原则

面向对象三大特征: (1)封装(Encapsulation) 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性.简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分. (2)继承(Inhe

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

面向对象三大特征之多态

面向对象的三大特征:封装.继承.多态.今天重点来看一下"多态". 封装 指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.将属性或方法进行封装,防止外部程序随机访问,加强代码的安全性. 继承 子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 子类继承父类,使用extends关键字. 子类可以访问父类那些属性和方法? private 本类       默认省略(default) 本类 同包     prote

面向对象三大特征之封装与static——(Java学习笔记四)

面向对象     编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一般,具体到抽象 三大特征: 封装 继承 多态 构造器:又叫构造方法(constructor),用于构造类的实例 格式:修饰符 类名(形参列表){ //语句 } 构造器的方法名与类名一致 通过new关键字调用 当没有定义构造方法时,系统会自定义一个无参构造函数 构造方法可以重载 作用:构造该类的对象,

面向对象三大特征------封装、继承、多态

首先,为什么要面向对象程序设计? 1.开发时间短,效率高,可靠性高,所开发的程序更强壮.由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间. 2.应用程序更易于维护.更新和升级.继承和封装使得应用程序的修改带来的影响更加局部化. 三大特性之封装 封装: 封装是面向对象的特征之一,是对象和类概念的主要特性.封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保

【c++笔记十二】面向对象三大特征之《多态》

2015年2月5日 晴 周四 虽然今天天气很好但是长沙重度污染还是呆在机房写笔记好了.昨天写了面向对象的三大特征的前两个--封装和继承.只有你好好理解了继承,我们才好开始今天的[多态]的讲解(如果不懂得请看我的[c++笔记十一]). --------------分割线---------------- 一.虚函数 在开始讲多态之前还得给大家补充两个知识点,第一个就是弄懂虚函数. 还记得我们昨天讲继承的最后一个知识点"多继承"时提到了,用虚继承解决成员数据访问.我们第一次看到了"