多态性
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学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
2. **类与对象**:Java的核心是面向对象编程,这一部分会深入讲解类的定义、对象的创建、封装、继承和多态性等概念。还会涉及构造函数、访问修饰符、抽象类和接口等关键概念。 3. **异常处理**:Java的异常处理机制...
以下是对Java学习笔记中提到的关键知识点的详细阐述: 1. **易用性**:Java的语法简洁,比C++更易于理解和学习。它的设计目标之一是让开发者能在各种平台上编写代码,而无需考虑底层硬件的复杂性。 2. **分布式...
3. **包与接口**:介绍了Java中的包机制,用于组织和管理类,以及接口的作用和实现方式,理解接口在多态性中的关键角色。 4. **异常处理**:讲解Java异常处理机制,如何使用try-catch-finally语句块捕获和处理异常...
理解封装、继承和多态性是理解面向对象编程的关键。 5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 6. **字符串处理**:String类在Java中是不可变的,了解其...
通常,Java学习笔记可能涵盖类、对象、封装、继承、多态性、控制流、数据类型、异常处理、集合框架、IO流、线程、网络编程等主题。如果能提供清晰的文本内容,我将非常乐意为您详细解释相关的Java编程概念。
### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...
Java学习笔记主要涵盖了Java的基本概念、语法、面向对象编程、继承、多态性、抽象类等知识点。 JDK、JRE和JVM 在Java学习笔记中,首先介绍了JDK、JRE和JVM的概念。JDK(Java Development Kit)是Java开发工具包,...
### Java学习笔记+程序员生涯 #### 一、面向对象编程基础 **面向对象与面向过程对比** 面向对象编程(Object-Oriented Programming, OOP)是现代软件开发中的一种核心编程范式,它强调以对象作为基本单位进行设计...
Java学习笔记Markdown版包含了多个章节,涵盖了Java编程的多个核心概念。这些笔记是学习Java时进行知识总结的理想资源,尤其适合初学者或正在巩固基础知识的开发者。以下是对这些笔记内容的详细解读: 1. **继承** ...
Java学习笔记涵盖了许多核心概念,包括面向对象编程的各个方面。以下是对这些知识点的详细解析: 1. **继承中方法的重写**: 当子类重写父类的方法时,子类方法的访问权限必须至少等于或大于父类中对应方法的访问...
【Java学习笔记】是针对Java初学者的一套全面的学习资源,旨在帮助新手快速掌握Java编程基础知识。这份资料包含了丰富的学习内容,如Java语言的核心概念、语法特性、面向对象编程思想等,同时也融入了实践性的练习,...
在“Java学习笔记(必看经典)”中,我们可以期待涵盖以下几个关键知识点: 1. **基础语法**:包括变量声明、数据类型(如基本类型和引用类型)、运算符、流程控制语句(如if条件语句、for循环、while循环和switch...
学习者可以通过这些实例深入理解类与对象的关系,以及如何利用封装、继承和多态性来设计高效、可维护的代码。 在CMD(命令提示符)环境下运行这些源代码,是学习Java的常见方式。CMD提供了一个简单的交互界面,用户...
《林信良 jdk6 java学习笔记》是一本专注于Java编程语言的学习资料,特别针对Java Development Kit (JDK) 6版本进行了深入讲解。作者林信良是一位在Java领域有深厚造诣的专业人士,他的这部作品旨在帮助读者掌握Java...
- **多态性**:探索接口、抽象类和动态绑定,理解多态性的实现方式。 - **封装**与**抽象**:深入理解封装的意义,掌握抽象类和接口的定义与使用。 #### 第五周:OOD设计与包管理 - 探讨面向对象的设计模式,理解...
本压缩包"java学习笔记JDK6课件和课本代码.rar"中包含的资源,旨在帮助学习者深入理解Java编程,并掌握JDK 6的关键特性。以下是一些主要的知识点: 1. **基础语法**:Java的基础语法包括变量声明、数据类型、运算符...
### Java学习笔记——面向对象与面向过程对比及面向对象特性详解 #### 面向对象基本概念 在Java学习过程中,面向对象是一个重要的概念。它不仅是一种编程思想,也是理解和解决问题的有效方式。面向对象的基本单位...