`
dasheng
  • 浏览: 148293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《java编程思想》学习笔记8,第八章 多态

阅读更多

1,多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。

 

2,向上转型(upcasting)

将某个对象的引用视为对其基类的引用的做法叫向上转型。

 

3,前期绑定和后期绑定(动态绑定)

 

将一个方法调用和一个方法的主体关联起来被称作绑定,若在程序执行前进行绑定(如果有的话,由编译器和连接程序实

 

现),叫前期绑定

 

在运行时根据对象的类型进行绑定,叫后期绑定,也叫动态绑定

 

java中除了static方法和final方法(private方法属于final方法)之外,其他的所有方法都是后期绑定,我们不必判定是否

 

应该进行后期绑定,它会自动发生。

 

一旦知道了java程序所有方法都是通过定态绑定之后,我们就可以编写只与基类打交道的程序代码了,并且这些代码对于

 

所有的导出类都可以正确运行。

 

public class Shape {
  public void draw() {}
  public void erase() {}
} ///:~

 

public class Circle extends Shape {
  public void draw() { print("Circle.draw()"); }
  public void erase() { print("Circle.erase()"); }
} ///:~

 

public class Square extends Shape {
  public void draw() { print("Square.draw()"); }
  public void erase() { print("Square.erase()"); }
} ///:~

 

public class Triangle extends Shape {
  public void draw() { print("Triangle.draw()"); }
  public void erase() { print("Triangle.erase()"); }
} ///:~

 

public class RandomShapeGenerator {
  private Random rand = new Random(47);
  public Shape next() {
    switch(rand.nextInt(3)) {
      default:
      case 0: return new Circle();
      case 1: return new Square();
      case 2: return new Triangle();
    }
  }
} ///:~

 

public class Shapes {
 
 private static RandomShapeGenerator gen = new RandomShapeGenerator();

    public static void main(String[] args)
    {
     Shape[] s= new Shape[9];
     
     for ( int i=0;i<s.length;i++)
     {
      s[i] = gen.next();
     }
     
     for (Shape shp :s)
     {
      shp.draw();
     }
    }
}

 

 

运行的结果是:

 

Triangle.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Circle.draw()

4,“覆盖”私有方法

 

public class PrivateOverride {
  private void f() { print("private f()"); }
  public static void main(String[] args) {
    PrivateOverride po = new Derived();
    po.f();
  }
}

class Derived extends PrivateOverride {
  public void f() { print("public f()"); }
} /* Output:

 

编译器不会报错,但是导出类的f()方法是一个新的方法,不会覆盖基类的f()方法。

 

5,构造器是隐含的static方法。

 

6,协变返回类型

 

jdk5中添加了协变返回类型,表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类。

 

class Grain {
  public String toString() { return "Grain"; }
}

class Wheat extends Grain {
  public String toString() { return "Wheat"; }
}

class Mill {
  Grain process() { return new Grain(); }
}

class WheatMill extends Mill {
  Wheat process() { return new Wheat(); }
}

public class CovariantReturn {
  public static void main(String[] args) {
    Mill m = new Mill();
    Grain g = m.process();
    System.out.println(g);
    m = new WheatMill();
    g = m.process();
    System.out.println(g);
  }
} /* Output:

 

7,向下转型和运行时类型识别

 

向上转型会丢失具体的类型信息,向下转型应该能获得类型信息。在c++中,必须执行一个特殊的操作才能获得安全的向下

 

类型。java所有转型都会得到检查!运行时会检查,以保证它却确实是我们希望的类型,否则,抛出

 

ClassCastException(类型转换异常)。这种在运行时对类型进行检查的行为称为“运行时类型识别”(RTTI)。

 

class Useful {
  public void f() {}
  public void g() {}
}

class MoreUseful extends Useful {
  public void f() {}
  public void g() {}
  public void u() {}
  public void v() {}
  public void w() {}

public class RTTI {
  public static void main(String[] args) {
    Useful[] x = {
      new Useful(),
      new MoreUseful()
    };
    x[0].f();
    x[1].g();
    // Compile time: method not found in Useful:
    // x[1].u();
    ((MoreUseful)x[1]).u(); // Downcast/RTTI
   // ((MoreUseful)x[0]).u(); // Exception thrown
  }
} ///:~

 

 

 

分享到:
评论

相关推荐

    Java编程思想笔记(全)

    ### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍了Java中的基本概念——对象。对象是面向对象编程的核心,它封装了数据和行为。本章首先解释了对象的概念,接着讨论了如何创建对象...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    java学习笔记

    【Java学习笔记】是针对Java编程语言的一份详尽的学习资料,主要由“圣思源”提供,旨在帮助初学者和进阶者深入理解和掌握Java技术。这份笔记可能包含了从基础语法到高级特性的全面讲解,结合了理论与实践,通过实例...

    java学习心得,笔记,思想

    理解如何创建和使用类,以及如何通过对象间的相互作用实现功能,是Java编程的关键。 接着,我们来看一下Java集合框架,这是处理数据集合的强大工具。ArrayList、LinkedList、HashSet、HashMap等是常用的数据结构,...

    java实战经典学习笔记

    ### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...

    java私塾学习笔记整理

    #### 第八章:异常和断言 **一、异常的分类** 1. **编译时异常**:必须被捕获或声明抛出。 2. **运行时异常**:一般是由程序错误引起的,可以选择捕获也可以不捕获。 **二、异常的处理** 通过try-catch-finally...

    大佬的java笔记

    由于提供的文件内容中,...如果要学习Java,最好的方式是从学习Java的基础语法和面向对象编程思想入手,逐步深入到类库使用和Java高级特性,同时实践相关的设计模式和架构设计,这样可以更全面地掌握Java编程的精髓。

    学习笔记:抽象封装、继承、多态.doc

    ### 学习笔记: 抽象封装、继承、多态 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。对象是由数据(即字段或属性)和对这些数据进行...

    core java培训学习笔记

    在"Core Java培训学习笔记"中,我们主要会涉及Java这门广泛使用的编程语言的基础和核心概念。Java以其平台独立性、高效性和安全性深受开发者喜爱,是许多初学者入门编程的首选语言。对于一个新手来说,通常在五天...

    java\CoreJava笔记\CoreJAVA_day01

    1. **编程思想**: - 面向对象编程(Object-Oriented Programming, OOP):Java是一种纯面向对象的语言,一切皆为对象,理解类、对象、封装、继承、多态等概念至关重要。 - 逻辑思维与面向对象思想:在编写代码时...

    ACCP8.0JavaOOP第一章学习笔记

    ### ACCP8.0 Java OOP 第一章学习笔记 #### 一、为什么使用面向对象 面向对象编程(Object-Oriented Programming, OOP)是一种重要的编程范式,它基于对象的概念来组织和构建软件。本章节主要介绍了面向对象的基础...

    JAVA经典教材笔记

    - Java作为一种广泛使用的编程语言,其学习路径包括掌握基本语法、理解面向对象编程思想、熟悉标准库使用等。 - **JAVA发展概述** - Java的发展历程:从1995年由Sun Microsystems公司发布以来,Java经历了多次重大...

    thinkinjava源码-ThinkingInJava:《Java编程思想4th》学习笔记Notesandsourcecodesaboutt

    本资源包含了这本书第四版的学习笔记和源代码,旨在帮助读者更好地理解和掌握Java编程思想。以下是对这些知识点的详细阐述: 1. **面向对象编程(OOP)**:Java是一种纯面向对象的语言,它强调类、对象、封装、继承...

    Java 基础 第2阶段:面向对象编程-尚硅谷学习笔记(含面试题) 2023年

    面向对象编程是Java的核心特性,本学习笔记涵盖了这一主题的深度探索,旨在帮助开发者深入理解并熟练运用面向对象的思想。2023年的版本更新可能包含最新的面试趋势和技术发展。以下将详细介绍Java面向对象编程的一些...

    韩顺平-循序渐进学Java零基础完整笔记

    《韩顺平-循序渐进学Java零基础完整笔记》是一份专为初学者设计的Java编程学习资料,由知名IT教育专家韩顺平老师精心编撰。这份笔记覆盖了从Java语言基础到进阶应用的全方位内容,旨在帮助没有编程背景的学员逐步...

    2023年java基础总结大全笔记.doc

    Java是一种广泛使用的编程语言,以其跨平台性和强大的功能而闻名。以下是对《2023年Java基础总结大全笔记》的详细...以上就是对Java基础的详尽解析,涵盖了从基本概念到高级特性的多个方面,是学习Java编程的良好起点。

    张龙 java se课程笔记

    【Java SE课程笔记详解】 Java SE(Standard Edition)是Java平台的核心版本,它为开发桌面应用、服务器端...通过深入学习和实践,你可以扎实掌握Java编程基础,为进一步深入学习Java EE或Android开发打下坚实的基础。

    达内Java笔记

    1. **Java语法基础**:Java的基础语法与C++相似,但更加强调面向对象的编程思想。变量、数据类型、运算符、流程控制语句(如if、for、while)是学习Java的起点。Java中的类和对象是其核心概念,理解类的定义、对象的...

    C#OOP上课笔记2016109.docx

    - 虽然笔记中没有直接涉及类、对象、继承、封装和多态等OOP核心概念,但这些基础知识是理解C#程序设计的基础,也是学习笔记后续章节可能会涵盖的内容。 7. **控制台交互**: - `Console.WriteLine()`和`Console....

    java详细笔记

    Java是一种广泛使用的面向对象的编程...这份笔记详尽地介绍了Java编程语言的各个方面,无论是初学者还是有经验的开发者,都能从中获得宝贵的启示和知识。通过深入学习和实践,可以为实际的软件开发工作打下坚实的基础。

Global site tag (gtag.js) - Google Analytics