练习:设计一个CBox类,具有length、width和height三个属性,对每个属性都提供相应的get和set方法,提供构造函数,完成CBox信息的初始化,增加volume()方法,用来计算CBox对象的体积,定义surfaceArea()方法用来计算CBox的表面积。
面向对象的三个特征:
(1)封装:封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联系。
封装的原则:使对象以外的部分不能随意存取对象的内部数据,从而有效的避免了外部错误对它的“交叉感染”。数据隐藏特性提升了系统安全性,使软件错误能够局部化,减少查错和排错的难度。如:微波炉,将线路板(属性)封装在微波炉内部,使用者无法接触到,而通过面板按钮(方法)简单的操控线路板工作。     
(2)继承:继承是软件重用的一种形式,它通过重用现有类的属性和方法,并增加新功能或修改现有功能来构建新的类。如:“人”这个类抽象了这个群体的一般特性,“学生”和“老师”都具备“人”所定义的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情况下,作为一个新类而存在。
(3)多态:多态是指在父类中定义的属性或方法被子类继承之后,可以具有不同的表现行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。如:动物会“叫”,“猫”和“鸟”都是动物的子类,但其“叫”声是不同的
新授内容:
1、继承:
表现的是一种共性和特性的关系,一个类可以继承另一个类,并在此基础上添加自己特有功能,这称为继承。在java中使用extends关键字表现继承关系。
格式:
[访问符][修饰符] class <子类名> extends <父类名>{
  [属性]  //成员变量
  [方法]  //成员
}
public tiger extends animal{
}
2、继承的特性
(1)Java是单继承的,即一个子类只能继承一个父类,被继承的类叫做父类(超类),继承的类叫做子类(派生类)。
(2)在继承过程中,子类拥有父类定义的所有属性和方法,但父类可以通过封装思想隐藏某些数据,然后提供子类可以访问的属性和方法。
(3)当生成子类对象时,Java默认首先调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象,再去调用子类的构造方法,生成子类的对象。要想生成子类的对象,首先生成父类的对象,没有父类对象就没有子类对象。
(4)如果一个类没有指明任何父类,则缺省的自动继承java.lang.Object类。Object类是所有类的顶级父类,在java中,所有类都是直接或间接的继承了Object类。
(5)super关键字:super关键字代表父类对象,主要有两个用途:
1)调用父类的构造方法
与super()所对应的就super表示对父类对象的引用。如果子类使用super()显示调用父类的某个构造方法,那么在执行的时候前面不会寻找构造方法而不再去寻找父类的不带参数的构造方法。super必须作为构造方法的第一条语句能有其他的,可执行语句。
2)访问父类的属性和方法。
当子类的属性或方法与父类的属性或方法重名时,可用super.属性名或super.方法名(参数列表)的方式访问父类的属性或方法。
3、多态
当子类继承父类时,可以在子类中直接使用父类的属性和方法。如果父类的方法无法满足子类的需求,则可以在子类中对父类的方法进行改造,这称为方法的重写,重写是java多态性的一种体现。
(1)、方法重写:又叫做覆写,子类与父类的方法返回值类型一样,方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。
public class Test2 {
public static void main(String[] args) {
Dog dog=new Dog();
dog.run();
}
}
class Animal{
public void run(){
System.out.println("Animal is running!");
}
}
class Dog extends Animal{
public void run(){
System.out.println("Dog is running!");
}
}
 
若给子类的run方法添加一个参数,则不叫重写。分别调用带参数的run和不带参数的run来执行一下。
(2)、方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。
(3)、方法重写需要遵循以下几点:
重写的方法的签名必须要和被重写的方法的签名完全匹配;
重写的方法的返回值必须和被重写的方法的返回一致或者是其子类;
重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
私有方法不能被重写
子类重写父类方法的过程中,可访问性只能一样或变的更公开。
(4)、多态
我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思是:父类型的引用可以指向子类的对象。
1)多态:父类型的引用可以指向子类型的对象。
public class Test3 {
public static void main(String[] args) {
Flower flower=new Rose();//多态
flower.sing();
}
}
class Flower{
public void sing(){
System.out.println("Flower is sing.");
}
}
class Rose extends Flower{
}
花是花,玫瑰是玫瑰,玫瑰是花,但花是玫瑰是错误的,花是玫瑰,那么康乃馨呢是花吗?对不对呀。
Rose rose=new Flower();
rose.sing();
2)、Flower flower=new Rose();当使用多态方式调用方法时,首先检查父类中是否有Sing方法,如果有,则去调用子类的sing方法(不管是继承的还是重写的)。有这个sing方法,则无法如果没有则编译错误。因为flower是一个Flower类型的变量,如果Flower类型没调用。
 Java实现多态有三个必要条件:继承、重写、向上转型。
         继承:在多态中必须存在有继承关系的子类和父类。
         重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
         向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
      只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
      对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
public class A {
    public String show(D obj) {
        return ("A and D");
    }
 
    public String show(A obj) {
        return ("A and A");
    }
 
}
 
public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    }
}
 
public class C extends B{
 
}
 
public class D extends B{
 
}
 
public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
    }
}
 
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
 
在这里看结果1、2、3还好理解,从4开始就开始糊涂了,对于4来说为什么输出不是“B and B”呢?
      首先我们先看一句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这句话对多态进行了一个概括。其实在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
      分析:
      从上面的程序中我们可以看出A、B、C、D存在如下关系。

首先我们分析5,a2.show(c),a2是A类型的引用变量,所以this就代表了A,a2.show(c),它在A类中找发现没有找到,于是到A的超类中找(super),由于A没有超类(Object除外),所以跳到第三级,也就是this.show((super)O),C的超类有B、A,所以(super)O为B、A,this同样是A,这里在A中找到了show(A obj),同时由于a2是B类的一个引用且B类重写了show(A obj),因此最终会调用子类B类的show(A obj)方法,结果也就是B and A。
      按照同样的方法我也可以确认其他的答案。
      方法已经找到了但是我们这里还是存在一点疑问,我们还是来看这句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这我们用一个例子来说明这句话所代表的含义:a2.show(b);
      这里a2是引用变量,为A类型,它引用的是B对象,因此按照上面那句话的意思是说有B来决定调用谁的方法,所以a2.show(b)应该要调用B中的show(B obj),产生的结果应该是“B and B”,但是为什么会与前面的运行结果产生差异呢?这里我们忽略了后面那句话“但是这儿被调用的方法必须是在超类中定义过的”,那么show(B obj)在A类中存在吗?根本就不存在!所以这句话在这里不适用?那么难道是这句话错误了?非也!其实这句话还隐含这这句话:它仍然要按照继承链中调用方法的优先级来确认。所以它才会在A类中找到show(A obj),同时由于B重写了该方法所以才会调用B类中的方法,否则就会调用A类中的方法。
      所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

JAVA初等基础__(面向对象三个特征, 封装,继承,多态)相关推荐

  1. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  2. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  3. OC面向对象的三大特征(封装 继承 多态)习题2 复合

    复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...

  4. 面向对象的四大特征 封装 继承 多态 抽象

    1.封装 广义: 类 方法 包 的定义本身就是一种封装 狭义: 在设计一个类的时候 将所有的属性设置为私有的 并对各个私有的属性设计相应的 存/取方法 来完成对属性的使用 私有化只能代表封装的特性 可 ...

  5. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  6. java的知识点11——面向对象的三大特征之一继承、instanceof 运算符、方法的重写override、Object类基本特性、toString方法

    面向对象的三大特征:继承.封装.多态 继承的实现 继承让我们更加容易实现类的扩展.子类是父类的扩展 使用extends实现继承 package cn.sxt;public class Test {pu ...

  7. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  8. 三大特征 封装 继承 多态

    ''' 1.面向对象与面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点:扩展性 ...

  9. 面向对象的个人理解(封装/继承/多态实践)

    目录 前言 为什么要封装? 为什么要继承? 什么是多态? 前言 计算机科学是一门实践性很强的科目,所有理论都不是凭空而来的,某种理论的出现都是为了解决过往的不足.面向对象是其中之一,但我们不能单从字面 ...

最新文章

  1. 如何让自己的开源库支持cocoapods?
  2. 点在多边形内外的判断【计算几何】
  3. Maven-学习笔记05【基础-使用骨架创建Maven的Java工程】
  4. DCMTK:生成内置的数据字典
  5. HDU 2049 不容易系列之(4)——考新郎( 错排 )
  6. Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较
  7. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
  8. ros 机械臂复位_ROS入门学习之八机器人综合应用
  9. LOJ#6360. 复燃「恋之埋火」(最小圆覆盖+高斯消元)
  10. Java 程序设计基础(第四版)下
  11. addEventListener和attachEvent的区别(转载)
  12. python 批量爬取网页pdf_python爬取网页内容转换为PDF文件
  13. python求n的阶乘并输出_python求n的阶乘
  14. 《炬丰科技-半导体工艺》石英深反应离子刻蚀特性研究
  15. Java、JSP电子商城
  16. python简单图片识别_用Python进行简单的图片识别(1)
  17. LC-3指令集 指令/状态码介绍
  18. GPS RTK测量定位原理
  19. 怎么查验佳能EOS单反相机是否正品
  20. 软件测试就业前景怎么样?

热门文章

  1. Matplotlib画图最全小白教程,代码+贴图保你看懂,都总结下来了,再无更全!
  2. 我从外包辞职了,10000小时后,走进字节跳动拿了offer
  3. 进程等待函数(waitpid)
  4. React Hooks 之 useRequest
  5. Ramnit病毒简介
  6. netlink实现与使用方法详解(用户态/内核态)
  7. 小浩浅谈 程序/进程/线程,并行/并发
  8. Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(C#)
  9. 硬盘、ROM、RAM
  10. 银色情人节,和TcaplusDB数据库一起过节吧!