Java初学——面向对象的封装,继承,多态

一、封装

  1.为什要封装

    封装的概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。把尽可能多的东西藏起来,对外提供便捷的接口。

    封装的好处:便于使用者正确使用系统,防止错误修改属性 有助于系统之间的松耦合,提高系统独立性 提高软件的可重用性 降低了构建大型系统的风险。

    封装的流程:

  :

  2.如何使用封装

    在myexclipse中在已经建好的类中,按住快捷键Shift+Alt+S选择R 在弹出面板中选择要封装的成员变量。具体流程如图:

  快捷键 Shift+Alt+S会出现如下图弹出界面 然后点击R

选择要封装的选项

点击ok,会生成get/set方法如图

或则选择myexlipse的工具栏Scoure---

二、继承

  1.继承的相关属性

     (1)在Java所有类都默认继承自Object,extends关键字实现类的继承。

    (2)单根性:一个类只能存在一个父类在Java中的继承:子类可以继承父类的任何非私有成员(变量 方法 构造) 子类永远比父类拥有更多的成员,子>父。提升代码的复用性:减少代码的冗余

    (3) Object:任意一个类都直接或间接继承Object 在MyEclipse中查看继承架构图的快捷键为ctrl+T ctrl+O 查看类中的所有成员

    (4)native:不是由java实现的,而是由C语言实现的。

    (5)final:常量 类(代表该类不能被继承) 方法(该方法不能被子类重写) 。

    (6)方法重写:子类继承了父类的方法后,要对父类的方法进行改写 要求除了方法体之外,其他的必须一致(就进原则)。

    (7)super:超类 super代表父类的对象。使用super关键字,super代表父类对象 ;在子类构造方法中调用且必须是第一句 ;不可以访问父类中定义为private的属性和方法如图:                                                                                                                                                                                                 

  2.继承条件下构造方法的调用规则

    子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法 系统默认调用父类的无参构造方法 子类构造方法通过super显式调用父类的有参构造方法 执行父类相应构造方法,而不执行父类无参构造方法 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则

  3.子类能继承什么

    能继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。

    不能继承父类中private成员,当子类与父类不在同包, 使用默认访问权限的成员。不能继承父类的构造方法。

   

三、多态

  1.什么是多态

    发生在具有继承关系的实体中,不同实体为了完成同一操作(函数名)所采取的不同方式(方法体)。在子类中方法重写:除方法体之外。其余完全一致

 方法的重写或方法的覆盖:子类根据需求对从父类继承的方法进行重新编写 重写时,可以用super.方法的方式来保留父类的方法 构造方法不能被重写

  2.方法重写是多态的基础

    方法重写的规则:方法名相同 参数列表相同 返回值类型相同或者是其子类 访问权限不能严于父类 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super) 父类的私有方法不能被子类覆盖 不能抛出比父类方法更多的异常。

    方法重写和方法重载的区别:

  3.面相对象设计八大原则

    开-闭原则(目标、总的指导思想)对扩展开放,对修改关闭。增加新功能,不改变原有代码。

    类的单一职责(一个类的定义)一个类有且只有一个改变它的原因。适用于基础类,不适用基于基础类构建复杂的聚合类。

    依赖倒置(依赖抽象)客户端代码(调用的类)尽量依赖(使用)抽象的组件。抽象的是稳定的。实现是多变的。

    组合复用原则(复用的最佳实践)如果仅仅为了代码复用优先选择组合复用,而非继承复用。组合的耦合性相对继承低。

    里氏替换(继承后的重写,指导继承的设计)父类出现的地方可以被子类替换,在替换后依然保持原功能。 子类要拥有父类的所有功能。子类在重写父类方法时,尽量选择扩展重写,防止改变了功能。

    接口隔离(功能拆分) 尽量定义小而精的接口interface,少定义大而全的接口。本质与单一职责相同。小接口之间功能隔离,实现类需要多个功能时可以选择多实现.或接口之间做继承。

    面向接口编程而非面向实现(切换、并行开发)客户端通过一系列抽象操作实例,而无需关注具体类型。便于灵活切换一系列功能。

    迪米特法则(类与类交互的原则)类与类交互时,在满足功能要求的基础上,传递的数据量越少越好。因为这样可能降低耦合度

  4.多态实现的三种方式

    父类类型接收子类对象实现的多态
     父类类型作为方法形参
     父类类型作为方法返回值

  5.继承关系的引用数据类型转换     

    向上转型:子类对象--->父类做的转换 无需强转(没有异常)理论上和数据类型的强转和自转类似,向上转型就像int类型向double自动转形一样,子类本身会继承父类所有的非私有的成员变量和方法,并且还有自己的成员。所以子类转向父类是自动转换。

  
    向下转型:父类类型--->子类类型转换 需要强转当父类向子类转换时有可能会运行报错,所以应用instanceof关 键词来规避如果能转换则会返回true,不能返回false。

  6综合练习

    以下代码运用抽象类 继承  封装 多态 类型转换 做的简单电子宠物购物系统(代码只是用于知识点的串联)

    创建Pet父类

      

 1 public abstract class Pet {
 2     private String name;//名字
 3     private String sex;//性别
 4     private int heathly;//健康值
 5     private int qinmidu;//亲密度
 6     abstract String leibieString(int i);    //创建品种判断抽象方法
 7     abstract void showinfo() ;//创建自我介绍抽象方法
 8     abstract int zhiliao();//创建宠物治疗方法 让狗每次治疗健康值加十 企鹅每次治疗加5
 9     //封装
10     public String getName() {
11         return name;
12     }
13     public void setName(String name) {
14         this.name = name;
15     }
16     public String getSex() {
17         return sex;
18     }
19     public void setSex(String sex) {
20         this.sex = sex;
21     }
22     public int getHeathly() {
23         return heathly;
24     }
25
26     public void setHeathly(int heathly) {
27         if (heathly<=100&&heathly>=0) {
28             this.heathly=heathly;
29         }else {
30             this.heathly=60;
31         }
32     }
33
34     public int getQinmidu() {
35         return qinmidu;
36     }
37
38     public void setQinmidu(int qinmidu) {
39         if (qinmidu<=100&&qinmidu>=0) {
40             this.qinmidu=qinmidu;
41         }else {
42             this.qinmidu=60;
43         }
44     }
45
46
47
48 }

  创建子类dog

    

public class Dog extends Pet {

    private String leibie;
    public String getLeibie() {
        return leibie;
    }
    public void setLeibie(String leibie) {
        this.leibie = leibie;
    }
    //实例化抽象方法
    @Override
    String leibieString(int i) {
        leibie=(i==1?"哈士奇":i==2?"京巴":"输入序号错误,请从新输入");
        return leibie;
    }
    @Override
    void showinfo() {
        System.out.println("你好主人:我叫"+super.getName()+"我是:"+ super.getSex()+"我的健康值是:"
    +super.getHeathly()+"和主人的亲密度为"+super.getQinmidu()+"我的品种是"+this.getLeibie());
    }
    @Override
    int zhiliao() {
        return (super.getHeathly()+10);
    }
    public void play(){
        System.out.println("经过强制转换我学会接飞镖");
    }
}

    创建Qie类

    

public class Qie extends Pet {
    private String leibie;
    public String getLeibie() {
        return leibie;
    }

    public void setLeibie(String leibie) {
        this.leibie = leibie;
    }

    @Override
    String leibieString(int i) {
        leibie=(i==1?"帝企鹅":i==2?"马达加斯加企鹅":"你的输入有误");
        return leibie;
    }

    @Override
    void showinfo() {
        System.out.println("你好主人:我叫"+super.getName()+"我是:"+ super.getSex()+"我的健康值是:"
                +super.getHeathly()+"和主人的亲密度为"+super.getQinmidu()+"我的品种是"+this.getLeibie());
    }

    @Override
    int zhiliao() {

        return (super.getHeathly()+5);
    }
    public  void eat() {
        System.out.println("经过了强制转换我会吃鱼");
    }

}

    创建测试类

    

import java.util.Scanner;

import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;

public class Pettest {
    public static void main(String[] args) {
        String ii;
        int i;
        Scanner inScanner=new Scanner(System.in);
        System.out.println("欢迎来到宠物医院!");
        System.out.print("您的宠物种类是(1.狗狗2.企鹅)");
        int q=inScanner.nextInt();
        switch (q) {
        case 1:
            Dog a=new Dog();
            System.out.println("你的宠物名字是:");
             ii=inScanner.next();
            a.setName(ii);
            System.out.println("请输入性别(1.靓仔2.辣妹)");
             i=inScanner.nextInt();
            if(i==1){
                    a.setSex("靓仔");
                }else if(i==2){
                    a.setSex("辣妹");
                }else {
                    System.out.println("性别输入错误请从新输入");
                    i=inScanner.nextInt();
                }
            System.out.println("请选择品种1.哈士奇2.京巴");
            i=inScanner.nextInt();
            a.leibieString(i);
            System.out.println("请输入健康值");
            i=inScanner.nextInt();
            a.setHeathly(i);
            System.out.println("请输入亲密度");
            i=inScanner.nextInt();
            a.setQinmidu(i);
            a.showinfo();

            System.out.println("经过治疗你的狗狗健康值为"+a.zhiliao());
//            Pet bPet=new Dog();
//            Dog d=(Dog)bPet;
//            d.play();
            Pet bPet=new Dog();
            //强制装换
            if ( bPet instanceof Dog ) {

                Dog d=(Dog)bPet;
                d.play();
            }

            break;

        case 2:
            Qie aa=new Qie();
            System.out.println("你的宠物名字是:");
             ii=inScanner.next();
            aa.setName(ii);
            System.out.println("请输入性别(1.靓仔2.辣妹)");
             i=inScanner.nextInt();
            if(i==1){
                    aa.setSex("靓仔");
                }else if(i==2){
                    aa.setSex("辣妹");
                }else {
                    System.out.println("性别输入错误请从新输入");
                    i=inScanner.nextInt();
                }
            System.out.println("请选择品种1.帝企鹅2.马达加斯加企鹅");
            i=inScanner.nextInt();
            aa.leibieString(i);
            System.out.println("请输入健康值");
            i=inScanner.nextInt();
            aa.setHeathly(i);
            System.out.println("请输入亲密度");
            i=inScanner.nextInt();
            aa.setQinmidu(i);
            aa.showinfo();

            System.out.println("经过治疗你的"+aa.getLeibie()+"健康值为"+aa.zhiliao());
            Pet bQPet=new Qie();
            //强制装换
            if ( bQPet instanceof Qie ) {

                Qie dD=(Qie)bQPet;
                dD.eat();
            }

            break;
            default:
                System.out.println("您的输入有误请从新输入");
                break;
        }
    }

}

  运行结果

原文地址:https://www.cnblogs.com/wuxuewei/p/10950897.html

时间: 2024-08-25 01:04:41

Java初学——面向对象的封装,继承,多态的相关文章

JAVA的三大特征 封装继承多态- 简单总结

简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 总的来说还是接口的重用. 那么总结一下,JAVA的三大特征 其好处 就是代码与接口的重用. 封装可以隐藏实现细节,使得代码模块化: 继承可以扩展已存在的代码模块(类): 它们的目的都是为了——代码重用. 而多态则是为了实现另一个目

C#面向对象编程 封装 继承 多态

  C#面向对象编程 什么是面向对象? 面向对象编程是上个实际六十年代继面向结构编程之后提出的一个新的编程思想 封装,继承,多态 封装,继承,多态是面向对象编程的核心: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型 意义是:保护数据不被破坏(例如一台电视机我们能使用它但是不能随意改变内部的电路) 关键字:private,public,protected,internal Public string name;

面向对象之封装,继承,多态的理解

封装 1.什么是封装 封装(encapsulation)又叫隐藏实现(Hiding the implementation).就是只公开代码单元的对外接口,而隐藏其具体实现. 其实生活中处处都是封装,手机,电脑,电视这些都是封装.你只需要知道如何去操作他们,并不需要知道他们里面是怎么构造的,怎么实现这个功能的. 2.如何实现封装 在程序设计里,封装往往是通过访问控制实现的.C++,Java,AS3中都有 Public, Protected, Private 等访问控制符.通过用Public将信息暴

Java三大特征:封装 继承 多态

内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外部类之内,部允许同一个包中其他类昂问该类.(2)内部类的方法可以直接访问外部类的所有数据,包括私有数据.(3)内部类所实现的功能使用外部类照样可以实现,只是有时使用内部类更方便. 成员内部类(普通内部类):内部类创建对象时,必须使用外部类对象来创建,而不能直接用new创建一个内部对象,即内部类 对象

面向对象之 封装 继承 多态

#!/usr/bin/env python # _*_ coding:utf-8 _*_ class Role(object): #继承object类 ac = None #脚本一执行跟着类一起存到了内存 类变量 #类变量和实例变量的区别: #类变量脚本执行跟着类一起存到了内存,不管是否调用都存在,实例变量是存在实例内的, def __init__(self,name,role,weapon): #初始化方法 实例化后自动执行 #self 代表实例本身.谁调用就是谁. name role,wea

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

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

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

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

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

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

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