多态是一个之前一直搞不清楚的概念,通过这次笔记,对多态的概念及应用有了较全面的认识,同时学习了instanceof关键字以及Object类的特点.
1. Java中类的多态
所谓类的多态性,是指子类对象和父类对象之间的相互转换. 这里分为两部分做笔记:
2.1 子类对象向父类对象转换(向上转换)
子类对象向父类对象的转换是自动转换.格式为: 父类对象 = 子类对象.
这里需要注意的一点事: 子类对象转换为父类对象后,所调用的方法一定会是子类复写后的方法而非父类原有方法.
例如下面的例子: view plaincopy to clipboardprint?
class Person
{
public void fun1()
{
System.out.println("Person -------> public void fun1() ");
}
public void fun2()
{
//fun2()调用的是fun1()的方法
this.fun1();
}
}
class Student extends Person
{
//复写Person类中的fun1()方法
public void fun1()
{
System.out.println("Student -------> public void fun1()");
}
public void fun3()
{
System.out.println("Student -------> public void fun1()");
}
}
public class Demo01
{
public static void main(String args[])
{
//声明一个父类对象
//new Student()是实例化一个子类对象,向父类对象转换
//子类对象向父类对象转换之后,所调用的方法一定是子类复写后的方法
Person p = new Student();
p.fun1();
p.fun2(); //这里也是通过this.fun2()调用的子类复写后的方法fun1()
}
}
class Person
{
public void fun1()
{
System.out.println("Person -------> public void fun1() ");
}
public void fun2()
{
//fun2()调用的是fun1()的方法
this.fun1();
}
}
class Student extends Person
{
//复写Person类中的fun1()方法
public void fun1()
{
System.out.println("Student -------> public void fun1()");
}
public void fun3()
{
System.out.println("Student -------> public void fun1()");
}
}
public class Demo01
{
public static void main(String args[])
{
//声明一个父类对象
//new Student()是实例化一个子类对象,向父类对象转换
//子类对象向父类对象转换之后,所调用的方法一定是子类复写后的方法
Person p = new Student();
p.fun1();
p.fun2(); //这里也是通过this.fun2()调用的子类复写后的方法fun1()
}
}
2.2 父类对象向子类对象转换(向下转换)
父类对象向子类对象的转换是强制转换. 格式为: 子类对象 = (子类名称) 父类对象
在父类对象向子类对象的转换的过程中,需要注意的是: 如果父类对象是实例化的父类对象而不是用子类对象转换过来的对象,则不能在强制转换为子类对象,否则会出现ClassCastException类转换异常. 也就是说,能进行父类对象向子类对象转换的前提是: 之前是使用子类对象的实例来初始化得父类对象. 例如下面例子中,是先使用实例化的子类对象转换为父类对象的. view plaincopy to clipboardprint?
class Person
{
public void fun1()
{
System.out.println("Person -------> public void fun1() ");
}
public void fun2()
{
//fun2()调用的是fun1()的方法
this.fun1();
}
}
class Student extends Person
{
//复写Person类中的fun1()方法
public void fun1()
{
System.out.println("Student -------> public void fun1()");
}
public void fun3()
{
System.out.println("Student -------> public void fun1()");
}
}
public class Demo02
{
public static void main(String args[])
{
//声明一个父类对象, new Student()是实例化一个子类对象,该子类实例化对象向父类对象转换
//父类对象向子类对象的转换,必须经过强制转换.
/* 注意: 若父类对象是实例化为父类对象而不是下例中用子类对象实例化后转换为父类对象,
那这时候就不能再强制转换为子类对象了,否则会有ClassCastException类转换异常 */
Person p = new Student();
Student s = (Student) p;
s.fun3();
s.fun1();
}
}
class Person
{
public void fun1()
{
System.out.println("Person -------> public void fun1() ");
}
public void fun2()
{
//fun2()调用的是fun1()的方法
this.fun1();
}
}
class Student extends Person
{
//复写Person类中的fun1()方法
public void fun1()
{
System.out.println("Student -------> public void fun1()");
}
public void fun3()
{
System.out.println("Student -------> public void fun1()");
}
}
public class Demo02
{
public static void main(String args[])
{
//声明一个父类对象, new Student()是实例化一个子类对象,该子类实例化对象向父类对象转换
//父类对象向子类对象的转换,必须经过强制转换.
/* 注意: 若父类对象是实例化为父类对象而不是下例中用子类对象实例化后转换为父类对象,
那这时候就不能再强制转换为子类对象了,否则会有ClassCastException类转换异常 */
Person p = new Student();
Student s = (Student) p;
s.fun3();
s.fun1();
}
}
结论:
在进行向下转换之前,两个对象必须先发生向上转换关系(如上面例子),否则无法转换(出现类转换异常).
--------------------------------------------------------------------------------
2. instanceof关键字
instanceof用于判断某个对象是否是某个类的实例. 例如: a instanceof B 若a是B的实例,则返回true,否则返回的是false.
instanceof的使用时机:
例如下例,一般情况下, 都是在转型之前使用instanceof进行一下判断,这样可以进行比较安全的类型转换. view plaincopy to clipboardprint?
class A
{
public void fun1()
{
System.out.println("A --> public void fun1()") ;
}
public void fun2()
{
// fun2方法调用的是fun1方法
this.fun1() ;
}
}
class B extends A
{
// 覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B --> public void fun1()") ;
}
public void fun3()
{
System.out.println("B --> public void fun3()");
}
}
class C extends A
{
// 覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C --> public void fun1()") ;
}
public void fun5(){
System.out.println("C --> public void fun5()");
}
}
public class Demo03{
public static void main(String args[])
{
fun(new C()) ;
}
/* 如果传入的是B类的对象,则要求再调用fun3()方法;
如果传入的是C类的对象,则要求再调用fun5()方法。
这样,通过instanceof,实现了判别某个对象到底是谁的实例 */
public static void fun(A a)
{
a.fun2() ;
//如果a是B的实例化对象,则调用fun3()
if(a instanceof B)
{
B b = (B)a;
b.fun3() ;
}
//如果a是B的实例化对象,则调用fun5()
if(a instanceof C)
{
C c = (C)a ;
c.fun5() ;
}
}
}
class A
{
public void fun1()
{
System.out.println("A --> public void fun1()") ;
}
public void fun2()
{
// fun2方法调用的是fun1方法
this.fun1() ;
}
}
class B extends A
{
// 覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B --> public void fun1()") ;
}
public void fun3()
{
System.out.println("B --> public void fun3()");
}
}
class C extends A
{
// 覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C --> public void fun1()") ;
}
public void fun5(){
System.out.println("C --> public void fun5()");
}
}
public class Demo03{
public static void main(String args[])
{
fun(new C()) ;
}
/* 如果传入的是B类的对象,则要求再调用fun3()方法;
如果传入的是C类的对象,则要求再调用fun5()方法。
这样,通过instanceof,实现了判别某个对象到底是谁的实例 */
public static void fun(A a)
{
a.fun2() ;
//如果a是B的实例化对象,则调用fun3()
if(a instanceof B)
{
B b = (B)a;
b.fun3() ;
}
//如果a是B的实例化对象,则调用fun5()
if(a instanceof C)
{
C c = (C)a ;
c.fun5() ;
}
}
}
--------------------------------------------------------------------------------
3. Object类
所有的类都继承自Object类,这是所有类的一个基类.
一个比较好的类,需要复写Object类中的三个方法.
|- public String toString()
|- public boolean equals(Object obj)
|- public int hashCode()
在下面的例子中,类Student复写了上面的toString()方法和equals()方法,而且使用到了instanceof关键字,算是一个小复习题目了~ view plaincopy to clipboardprint?
class Student //任意类都是继承了Object类,最好复写里面的toString()和equals()方法
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
//复写Object类中的toString()方法,实现自定义toString()
public String toString()
{
return "该学生的姓名是: "+name+",该学生的年龄是: "+age;
}
//复写Object类中的equals()方法,注意,Object类中equals()接收的是Object对象
public boolean equals (Object obj)
{
//如果被比较对象和比较对象的内存地址都是一样的,那肯定是同一对象
//注意: 内存地址的比较使用"=="
if (this == obj)
{
return true;
}
else
{
//如果obj不是Student的实例,肯定不相等了,返回false;
if(!(obj instanceof Student))
{
return false;
}
else
{
//走到这步,说明obj是Student的实例对象,进行类型转换后对比之
Student stu = (Student) obj;
if(this.name.equals(stu.name)&&this.age == stu.age)
{
return true;
}
else
{
return false;
}
}
}
}
}
public class Demo04
{
public static void main(String args[])
{
Student stu1 = new Student("newsainton",23);
Student stu2 = new Student("newsainton",23);
//使用toString()方法输出stu1对象
System.out.println(stu1.toString());
//使用toString()方法输出stu2对象
System.out.println(stu2.toString());
//比较stu1和stu2是否相等
System.out.println("比较stu1和stu2是否相等: "+ stu1.equals(stu2));
}
}
发表评论
-
Servlet
2010-08-20 11:28 4951.什么是Servlet? ... -
MyEclipse快捷键
2010-08-20 11:27 521存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取 ... -
java面试题
2010-08-20 11:26 475第一,谈谈final, finally, finalize的区 ... -
Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
2010-08-20 11:24 936抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下 ... -
Java学习笔记---14.面向对象编程09-Java中重载与复写的区别、super与this的比较
2010-08-20 11:22 8211. 方法重载与方法复写的区别 区别 ... -
Java学习笔记---13.面向对象编程08-Java中继承的概念,子类实例化过程,super()及方法复写
2010-08-20 11:12 1001继承是OOP的三大特点之一. 这一节主要做一下继承的笔记. ... -
Java学习笔记---12.面向对象编程07-Java中的static关键字用法
2010-08-20 11:08 853static关键字应用点有3个: static变量(属性)的声 ... -
Java学习笔记---11.面向对象编程06-Java的内部类及对象数组
2010-08-20 11:04 8291. Java的内部类机制 所谓内部类,是指在一 ... -
java学习笔记---10.面向对象编程05-面向对象程序的设计步骤
2010-08-20 11:03 771这一部分需要注意一个原则, 熟练掌握OOP的程序设计方法. ... -
Java学习笔记---9.面向对象编程04-this关键字的使用
2010-08-20 11:00 729Java学习笔记---9.面向对象编程04-this关键字的使 ... -
Java学习笔记---8.面向对象编程03-String类的重点应用
2010-08-20 10:59 694在String类这一部分很重要,分为三个问题来做笔 ... -
Java学习笔记---7.面向对象编程02-类的封装性以及构造方法
2010-08-20 10:57 7921. 类的封装特性: 类的封装性是指类 ... -
Java学习笔记---6.面向对象编程01-类对象的构建及对象的引用传递
2010-08-20 10:54 667Java学习笔记---6.面向对象编程01-类对象的构建及对象 ... -
Java学习笔记---5.Java数组和方法
2010-08-20 10:53 7151. 数组的声明语法 Java中数组的声明有两种形 ... -
Java学习笔记---4.Java的分支循环语句
2010-08-20 10:51 690switch的使用如下例: view plain ... -
Java学习笔记---3.运算符与表达式
2010-08-20 10:49 679这一部分需要再强调的东西不多,因为运算符表达式都是平时最常用的 ... -
Java学习笔记---2.Java标识符和基本数据类型
2010-08-20 10:48 929这一块里面,标识符比较简单,没有什么需要记录的东西. ... -
Java学习笔记---1.Java发展及JDK配置
2010-08-20 10:47 768Java的老东家是Sun公司(Sun的全名,Stanford ...
相关推荐
6.1. 面向对象与面向过程 6-11 6.2. 对象的概念 6-12 6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9....
计算机后端-Java-Java核心基础-第14章 面向对象06 05. instanceof关键字的使用.avi
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
java开发-com.alibaba.fastjson.JSONObject
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java学习笔记 1 命令行运行 1 Java基础 1 注释 1 单行注释 1 多行注释 1 文档注释 1 标识符和关键字 2 数据类型 4 类型转换 7 变量 9 基本运算符 10 包机制 12 Javadoc 12 使用命令行生成 12 使用idea生成 12 Java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Object(对象).docx operator(运算符).docx Properties.docx return语句的例子.docx Scanner和if语法.docx static.docx 毕向东视频的笔记.docx 参数传递.docx 第二周所学总结.docx 反射机制.docx 泛型.docx 封装...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...
Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java...