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

java学习笔记(二十六)多态性

 
阅读更多

多态性

1.1 方法的重载与覆写 对象的多态性

对象多态性的类型主要有两种

A:向上转型:子类对象-》父类对象

对于向上转型,程序自动完成

格式: 父类 父类对象 = 子类实例;


class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say(){
System.out.println("B->say()");
}
};
public class polDemo01
{
public static void main(String args[]){
B b = new B();
A a = b;
a.print();
a.fun1();
}
}
结果:


F:\java>javac polDemo01.java

F:\java>java polDemo01
B
B


如果子类没被覆盖,

class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print1(){
System.out.println("B");
}
public void say(){
System.out.println("B->say()");
}
};
public class polDemo01
{
public static void main(String args[]){
B b = new B();
A a = b;
a.print();
a.fun1();
}
}
结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01
A
A

B:向下转型: 父类对象-》子类对象

对于向下转型,必须明确的指明要转型的子类类型

子类 子类对象 = (子类)父类实例;

class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say(){
System.out.println("B->say()");
}
};
public class polDemo01
{
public static void main(String args[]){
A a = new B();
B b = (B)a;
b.print();
b.fun1();
b.say();
}
}


结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01
B
B
B->say()
在类B中存在三个方法,都可以调用。
但进行对象向下转型时候要注意:

class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say(){
System.out.println("B->say()");
}
};
public class polDemo01
{
public static void main(String args[]){
A a = new A();//实例化一个父类对象
B b = (B)a;
b.print();
b.fun1();
b.say();
}
}
但是结果出现异常:


F:\java>java polDemo01
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
at polDemo01.main(polDemo01.java:23)


提示A不能转到B,以上的异常是第二大出现的异常,此异常出现是在对象转型的时候经常发生的,如果两个没有关系的对象之间发生了转换关系,则肯定出现此异常。


如果要想产生对象的向下转型,则肯定必须产生一个向上转型关系。。


1.2 对象多态性的应用


class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say1(){
System.out.println("B->say()");
}
};
class C extends A
{
public void print(){
System.out.println("C");
}
public void say2(){
System.out.println("C->say()");
}
};

public class polDemo01
{
public static void main(String args[]){
fun(new B());
fun(new C());
}
public static void fun(A a){
a.print();
}
}

结果:


F:\java>javac polDemo01.java

F:\java>java polDemo01
B
C


如果采用以上的代码实现,不管有多少子类,都可以轻松实现。。

1.3 instanceof关键字

在java中可以使用instanceof关键字判断一个对象到底是那个类的实例。

格式:对象 instanceof 类 ---->返回boolean类型

class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say1(){
System.out.println("B->say()");
}
};


public class polDemo01
{
public static void main(String args[]){
A a1 = new B();
System.out.println("A a1 = new B():"+(a1 instanceof A));
}

}

结果:


F:\java>javac polDemo01.java

F:\java>java polDemo01
A a1 = new B():true

可以看出a1是A的实例,那么a1是不是B的实例呢?


class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say1(){
System.out.println("B->say()");
}
};


public class polDemo01
{
public static void main(String args[]){
A a1 = new B();
System.out.println("A a1 = new B():"+(a1 instanceof A));
System.out.println("A a1 = new B():"+(a1 instanceof B));

}

}

结果:


F:\java>javac polDemo01.java

F:\java>java polDemo01
A a1 = new B():true
A a1 = new B():true


a1也是B的实例

1.4

class A
{
public void print(){
System.out.println("A");
}
public void fun1(){
this.print();
}
};
class B extends A
{
public void print(){
System.out.println("B");
}
public void say1(){
System.out.println("B->say()");
}
};


public class polDemo01
{
public static void main(String args[]){
A a1 = new B();
System.out.println("A a1 = new B():"+(a1 instanceof A));
System.out.println("A a1 = new B():"+(a1 instanceof B));
A a2 = new A();
System.out.println("A a2 = new A():"+(a2 instanceof A));
System.out.println("A a2 = new A():"+(a2 instanceof B));

}

}

结果:


F:\java>javac polDemo01.java

F:\java>java polDemo01
A a1 = new B():true
A a1 = new B():true
A a2 = new A():true
A a2 = new A():false


在开发中一定要注意,对于向下转型操作最好增加验证,以保证转型时不会发生ClassCastexception的错误。

在开发中一定要记住一点:

【一个类永远不要去继承一个已经实现好的类,只能继承抽象类或者实现接口。】


分享到:
评论

相关推荐

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    《Java学习笔记》

    2. **类与对象**:Java的核心是面向对象编程,这一部分会深入讲解类的定义、对象的创建、封装、继承和多态性等概念。还会涉及构造函数、访问修饰符、抽象类和接口等关键概念。 3. **异常处理**:Java的异常处理机制...

    Java学习笔记非常详细

    以下是对Java学习笔记中提到的关键知识点的详细阐述: 1. **易用性**:Java的语法简洁,比C++更易于理解和学习。它的设计目标之一是让开发者能在各种平台上编写代码,而无需考虑底层硬件的复杂性。 2. **分布式...

    良葛格java学习笔记

    3. **包与接口**:介绍了Java中的包机制,用于组织和管理类,以及接口的作用和实现方式,理解接口在多态性中的关键角色。 4. **异常处理**:讲解Java异常处理机制,如何使用try-catch-finally语句块捕获和处理异常...

    Java学习笔记(整理)

    理解封装、继承和多态性是理解面向对象编程的关键。 5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 6. **字符串处理**:String类在Java中是不可变的,了解其...

    JAVA学习笔记JAVA学习笔记.doc

    通常,Java学习笔记可能涵盖类、对象、封装、继承、多态性、控制流、数据类型、异常处理、集合框架、IO流、线程、网络编程等主题。如果能提供清晰的文本内容,我将非常乐意为您详细解释相关的Java编程概念。

    java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...

    java学习笔记.docx

    Java学习笔记主要涵盖了Java的基本概念、语法、面向对象编程、继承、多态性、抽象类等知识点。 JDK、JRE和JVM 在Java学习笔记中,首先介绍了JDK、JRE和JVM的概念。JDK(Java Development Kit)是Java开发工具包,...

    java学习笔记比较全面

    - **多态性**:多态性意味着一个接口可以有不同的实现,使得程序更具灵活性和可扩展性。 2. **基本语法** - `System.out.println` 和 `System.out.print` 都用于输出,区别在于 `println` 会自动换行,而 `print`...

    java学习笔记markdown

    Java学习笔记Markdown版包含了多个章节,涵盖了Java编程的多个核心概念。这些笔记是学习Java时进行知识总结的理想资源,尤其适合初学者或正在巩固基础知识的开发者。以下是对这些笔记内容的详细解读: 1. **继承** ...

    java学习笔记 java学习笔记

    Java学习笔记涵盖了许多核心概念,包括面向对象编程的各个方面。以下是对这些知识点的详细解析: 1. **继承中方法的重写**: 当子类重写父类的方法时,子类方法的访问权限必须至少等于或大于父类中对应方法的访问...

    Java学习笔记适合java初学者使用

    【Java学习笔记】是针对Java初学者的一套全面的学习资源,旨在帮助新手快速掌握Java编程基础知识。这份资料包含了丰富的学习内容,如Java语言的核心概念、语法特性、面向对象编程思想等,同时也融入了实践性的练习,...

    Java学习笔记(必看经典)

    在“Java学习笔记(必看经典)”中,我们可以期待涵盖以下几个关键知识点: 1. **基础语法**:包括变量声明、数据类型(如基本类型和引用类型)、运算符、流程控制语句(如if条件语句、for循环、while循环和switch...

    java学习笔记源代码(第6版)-林信良

    学习者可以通过这些实例深入理解类与对象的关系,以及如何利用封装、继承和多态性来设计高效、可维护的代码。 在CMD(命令提示符)环境下运行这些源代码,是学习Java的常见方式。CMD提供了一个简单的交互界面,用户...

    林信良 jdk6 java学习笔记

    《林信良 jdk6 java学习笔记》是一本专注于Java编程语言的学习资料,特别针对Java Development Kit (JDK) 6版本进行了深入讲解。作者林信良是一位在Java领域有深厚造诣的专业人士,他的这部作品旨在帮助读者掌握Java...

    java lecture note(Java学习笔记)

    - **多态性**:探索接口、抽象类和动态绑定,理解多态性的实现方式。 - **封装**与**抽象**:深入理解封装的意义,掌握抽象类和接口的定义与使用。 #### 第五周:OOD设计与包管理 - 探讨面向对象的设计模式,理解...

    java学习笔记JDK6课件和课本代码.rar

    本压缩包"java学习笔记JDK6课件和课本代码.rar"中包含的资源,旨在帮助学习者深入理解Java编程,并掌握JDK 6的关键特性。以下是一些主要的知识点: 1. **基础语法**:Java的基础语法包括变量声明、数据类型、运算符...

    java学习笔记

    ### Java学习笔记——面向对象与面向过程对比及面向对象特性详解 #### 面向对象基本概念 在Java学习过程中,面向对象是一个重要的概念。它不仅是一种编程思想,也是理解和解决问题的有效方式。面向对象的基本单位...

Global site tag (gtag.js) - Google Analytics