06 继承与多态

  1. 动手实验

  因为子类继承于父类,构造方法相当于对象初始化,只有父类先完成初始化,子类对象才能执行自己的初始化。子类在进行初始化的时候会默认调用父类的构造,所以不能反过来。

动手动脑

代码:

 1 package Parent_son;
 2 class Parent
 3 {
 4     public int value=100;
 5
 6     public void Introduce()
 7     {
 8
 9             System.out.println("I‘m father");
10
11         }
12 }
13 class Son extends Parent
14 {
15
16     public int value=101;
17
18          public void Introduce()
19     {
20             super.Introduce();
21              System.out.println("I‘m Parent"+ super.value);
22             System.out.println("I‘m son");
23     }
24 }
25 public class JiCheng1 {
26
27     public static void main(String[] args) {
28           Son p=new Son();
29             p.Introduce();
30             System.out.println(p.value);
31
32     }
33 }

结果截图:

3.子类与父类间的类型转换

     

d=m,d=c,c=(Cat)m不能运行

     m=d,子类对象可以直接赋给基类变量,因为子类是对父类的一个改动,有父类里的所有的变量。

  1.

    如果父类对象与引用指向的实际是一个子类对象,那么调用这个方法时,可以使用子类对象作为实际参数。

  2.

    类型转换必须在继承层次类转换,即超类与子类间。d=m因为父类里面不一定包含全部子类所有的变量,基类对象要赋给子类对象变量,必须执行类型转换,如d=(Dog)m所示。

  3.

    d=c兄弟类间不存在继承,因此也不存在类型转换。 

  4.

    对象的赋值是地址标识的传递,即两个对象名共同使用同一段内存地址。

  5.

     c=(Cat)m中不显示错误,会抛出异常,相当于“子=(子)父”如果父类变量引用的是正确的子类型(即父类对象要想类型转换后赋给子类对象,其本身引用的是子类型的内存空间),赋值将执行,如果父类变量引用的是不相关的子类型,将会生成class CastException异常。

4. 同名函数的处理

  1.   上面的程序运行结果是什么?

             2.  你如何解释会得到这样的输出?

    子类对象可以赋值给父类,子类可以覆盖父类,但是父类中的变量的值是不会变化的,访问父类中的变量中的变量时,可以用super关键词来访问。parent.printValue()的方法实际会调用child.printValue()方法(因为此时的parent引用child),即引用对象后,调用parent.printValue()即引用对象将原来父类的方法在child子类中重写了,父类被覆盖时,如果子类被当做父类使用,则通过子类访问的字段是父类的!对父类中的变量进行操作时,parent.myValue++,父类中的变量改变,子类的属性不变,因为此时仍然使用的是子类的方法,所以输出子类的属性。

    ((Child)parent).myValue++;

    将parent强制转换为Child类型,所以操作属性为子类的,所以输出结果为:201

           3  计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

    当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类具有相同的字段,则,子类中的字段会代替会隐藏父类的字段,子类方法中访问的是子类的字段(而非父类中的字段)。如果子类方法确实相访问父类中被隐藏的同名字段,可以用super关键词来访问。

    父类的引用可以调用父类中定义所有属性与方法,对于子类中定义而父类中没有的属性与方法,父类引用无法调用。子类重定义父类已有的属性,父类引用的还是本类的属性值。子类重定义父类已有方法时,父类引用调用的是子类重写过的方法。

    而父类赋值给子类必须经过子类强制转换,此时的对象已是子类对象,对象操作的属性,方法是子类的。

5.接口

  能否把“会游泳”、“能被吃”这种特性独立出来作为一种“可选项”,可以被“附加”到具体对象上?

  在面向对象世界中,可以使用“接口(interface)”来抽象对象的行为特性。定义一个接口,采用关键字interface,实现一个接口,采用关键字implements接口的成员函数自动成为public的,数据成员自动成为 static和final的。如果接口不声明为public的,则自动变为package。

  一个类可以同时实现多个接口。

  可以通过继承接口来扩充已有接口,并形成一个新的接口。

        interface OneInterface {

  void f1();

  }

  interface TwoInterface extends OneInterface {

  void f2();

  }

  实现子接口的类,必须实现“父”“子”接口所定义的所有方法,才能被实例化(即new出一个对象)接口也可定义常量,

  public interface ArrayBound {

  public static final int LOWBOUND=1;

  public static final int UPBOUND=100;

  }

  只要一个类声明实现了这个接口,就可以直接使用这些常量名

  注意:定义在接口中的常量必须被初始化。

实例:

 1 package 测试1;
 2  interface  Food
 3 {
 4     public void Cook();
 5 }
 6  interface  Swim
 7 {
 8     public void swim();
 9 }
10 class Bird
11 {
12     public void show() {
13         System.out.println("Duck is a bird");
14     }
15 }
16  class Duck extends Bird implements Swim,Food
17 {
18     public void Cook() {
19         System.out.println("Duck can be cooked");
20     }
21     public void swim() {
22         System.out.println("Duck can swim");
23
24     }
25 }
26 public class Anaimal {
27     public static void main(String[] args) {
28         Food f = new Duck();//接口类型  接口类型的变量=new 实现了接口的具体类型()
29         Swim s=new Duck();
30         s.swim();
31         f.Cook();
32
33     }
34
35 }

结果截图:

时间: 2024-10-10 19:08:28

06 继承与多态的相关文章

06继承与多态

继承与多态动手动脑问题: public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(

网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档

小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心:通过该项目,我们对业务流程有一个整体把控.对继承和多态有深入的了解 下面是类图: 主界面图: 核心思路: 1   1.首先在频道管理类ChannelManager中写一个加载所有频道方法LoadAllChannel; 2   3        该方法作用读取FullChannels.xml文件,并且

2、C#面向对象:封装、继承、多态、String、集合、文件(上)

面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. 打包,便于管理,为了解决大型项目的维护与管理. 三.什么是类? 将相同的属性和相同方法的对象进行封装,抽象出 “类”,用来确定对象具有的属性和方法. 类.对象关系:人是类,张三是人类的对象. 类是抽象的,对象是具体的.对象可以叫做类的实例,类是不站内存的,对象才占内存. 字段是类的状态,方法是类执

Java的继承与多态

Java的继承与多态对于提高开发效率,减少开发量,是非常有帮助的,也便于代码维护.下面是根据书上讲的,我又做了改进的例子. 假设需求: 公司需要对所有人员进行管理,所有人员分为普通员工和经理人,他们的头衔.工资.生日等信息都是不一样的,但是不能开发两套系统分别进行管理,而是要一套系统完成对所有人的管理. 设计一个员工类,这是父类,定义如下: package com.myHelloWorld; import java.text.ParseException; import java.text.Si

Java 继承、多态与类的复用

摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了它的实现机制和详细应用.此外,为了更好地理解继承和多态.我们对final关键字进行了全面的介绍. 在此基础上.我们介绍了Java中类的载入及初始化顺序.最后.我们对面向对象设计中三个十分重要的概念–重载.覆盖与隐藏进行了详细的说明. 要点: 继承 组合,继承,代理 多态 final 关键字 类载入及

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

Objective-C的封装、继承与多态

面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐藏对象的实现细节,不让用户看到,以此来增强安全性和简化编程,进而达到封装的目的. 使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员. 访问修饰符:private.protect.public private:私有的,不可供外部访问的信息,只有类本身能存取. prot

【转】C#三大特性之 封装、继承、多态

C#三大特性之 封装.继承.多态 一.封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型.  封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改. 封装提供了一个有效的途径来保护数据不被意外的破坏.相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fie

Objective--C三大特性:封装,继承,多态(杂乱的东西)

OC中类的特性共有有三个,它们分别是封装.多态和继承. 1.成员变量的作用域.成员变量的作用域应该也是封装的一种,它对成员变量的作用范围做出了一些限制. @public : 在任何地方都可以直接访问成员变量. @protected:在本类和子类中可以直接访问. @private:只能在本类中访问. @package:在同一个框架内可以访问. 默认情况下在类的声明中定义的成员变量的修饰符是@protected,在类的实现中定义的成员变量的修饰符是@private. 总结:(1)封装是为了保护类中的