一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。
父类:人 子类:男人
向上转型: Person p = new Man() ; //向上转型不需要强制类型转化
向下转型: Man man = (Man)new Person() ; //必须强制类型转化
向上转型 子类创建对象时,可以使用向上转型的形式操作,方法程序的后期维护, List队列也是使用的向上转型
package com.wj.interfaceDemo; /** *向上转型 */ class People{ //定义一个基类:三个属性和打印属性的方法 String name ="java",sex="android";//名字和性别 int age=15;//年龄 //打印输出 public void getAll(){ System.out.println("name:"+name+" sex:"+sex+" age:"+age); } } //子类继承基类 public class Man extends People{ //主方法 public static void main(String[] args) { //向上转型 Man p = new Man(); //调用父类的方法 p.getAll(); } }
运行结果:
name:java sex:android age:15
<!--[if !supportLists]-->2)<!--[endif]-->,向下转型
子类必须强制的转型为父类的数据类型
向下转型: Man man = (Man)new Person() ; //必须强制类型转化
向上转型子类不需要强制转型为父类的数据类型
向下转型不要使用 一下的方式
A demo =(A) new ManDemo();
demo.getName();
/** * 向下转型 */ class ManDemo { String name = "android"; public void getName() { System.out.println(name); } } //A类继承ManDemo class A extends ManDemo { } public class PeopleDemo { public static void main(String[] args) { // 向下转型 // cannot convert from ManDemo to PeopleDemo // 必须要向上转型,ManDemo不可以转为PeopleDemo // PeopleDemo p=new ManDemo(); // 向下转型必须要是子类才可以转型 ManDemo demo = new A(); // 将父类转为子类 A a = (A) demo; // 调用父类的方法 a.getName(); // *************第二种转型 ManDemo demos = new A(); //使用instanceof控制类型,防止类型不一样的情况 if(demos instanceof A){ //转为A A aa = (A) demos; aa.getName(); } } }
运行结果;
android
android
二:多态:允许不同类的对象对同一消息做出处理
package com.wj.interfaceDemo; //*多态 public class Shape { public static void main(String[] args) { // 创建对象时使用的是多态 ShapeMain s = new ShapeMain(); s = new Circle(); // 此时的s.draw()调用的是父类还是子类的方法 s.draw(); } } // 基类 class ShapeMain { // 基类定义方法 public void draw() { System.out.println("ShapeMain"); }; } // Circle继承基类 class Circle extends ShapeMain { @Override // 重写基类基类的方法 public void draw() { System.out.println("Circle"); }; }
运行结果:
Circle
三;多态的缺陷缺陷
<!--[if !supportLists]-->1)<!--[endif]-->.不能“覆盖” 私有方法
package com.wj.interfaceDemo; //覆盖私有的方法 public class PrivateOverride { private void f() { System.out.println("private f()"); } public static void main(String[] args) { 创建 PrivateOverride p = new Derived(); p.f();//调用f()方法 } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } }
运行结果:
Private f()
从前面写的程序中一眼就看出执行的结果是:public f(), 但是多态中是不能够覆盖私有方法 如果存在私有的方法就睡直接在前面加上final 执行结果为private f() ,只有非private的方法才可以被覆盖 这是多态的缺陷之一
<!--[if !supportLists]-->2)<!--[endif]-->缺陷 :不能覆盖域与静态方法
What is a field in java?
A field is an attribute. A field may be a class's variable, an object's variable, an object's method's variable, or a parameter of a function.
package com.wj.interfaceDemo; class Super{ public int field=0; public int getField(){ return field; } } class Sub extends Super{ public int field=1; public int getField(){ return field; } public int getSuperField(){ //调用父类的Field return super.field; } } public class FieldAccess { public static void main(String[] args) { //创建对象 Super sup=new Sub(); System.out.println("sup.field ="+sup.field+" sup.getField()="+sup.getField()); //创建对象 Sub sub = new Sub(); System.out.println("sub.field ="+sub.field+" sub.getField()="+sub.getField()+" sub.getSuperField() ="+sub.getSuperField()); } }
sup.field =0 sup.getField()=1
sub.field =1 sub.getField()=1 sub.getSuperField() =0
3),不能覆盖静态属性和方法
package com.wj.interfaceDemo; /* * 多态性不能覆盖静态方法 */ class StaticSuper{ //静态属性 public static String getName(){ return "java"; } public String getSex(){ return "男"; } //静态方法 static int age=10; } class StaticSub extends StaticSuper{ //静态方法 public static String getName(){ return "android"; } public String getSex(){ return "女"; } //静态属性 static int age=7; } public class StaticField { public static void main(String[] args) { //静态属性在多态性中是不能被覆盖的 StaticSuper s=new StaticSub(); System.out.println(s.getName()); System.out.println(s.getSex()); System.out.println(s.age); } }
运行结果:
java
女
10
四:构造器的执行顺序
构造器是不同于其它种类的方法,涉及到多态时也是如此,构造器是不具有多态性的,通过static方法,static为隐式的
package com.wj.interfaceDemo; /*构造器的调用顺序 */ class Construct1 { public Construct1() { print(); } private int print() { System.out.println("Construct1"); return 1; } } class Construct2 extends Construct1 { public Construct2() { print(); } private int print() { System.out.println("Construct2"); return 2; } } class Construct3 extends Construct2 { public Construct3() { print(); } private int print() { System.out.println("Construct3"); return 3; } } public class Construct { public static void main(String[] args) { Construct1 c = new Construct3(); } }
运行结果:
Construct1
Construct2
Construct3
五:用继承进行设计
package com.wj.interfaceDemo; /** * 用继承设计 */ class Actor { public void act() { } } class HappyActor extends Actor { public void act() { System.out.println("HappyActor"); } } class SadActor extends Actor { public void act() { System.out.println("SadActor"); } } class Stage { private Actor actor = new HappyActor(); public void change() { actor = new SadActor(); } public void performplay() { actor.act(); } } public class ExtendsDesign { public static void main(String[] args) { Stage stage = new Stage(); stage.performplay(); stage.change(); stage.performplay(); } }
实现没有搞清楚用继承设计到底讲的什么,求大神指教
相关推荐
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
Java编程思想第08章多态.ppt
java对象的引用,控制程序流,初始化和清除,封装,复用类,多态,接口和内部类,异常处理try——catch,类的检查,对象的集合,i/o系统,并发,分析与设计,对象的传递和返回
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
常用工具类与算法的实现(数组、向量、字符串、链表),java.awt、javax.swing中常用标准GUI组件及相应的事件处理,Java的异常处理机制,Java的数据库连接技术,Java的多线程技术与动画制作以及Java的网络编程。...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
常用工具类与算法的实现(数组、向量、字符串、链表),java.awt、javax.swing中常用标准GUI组件及相应的事件处理,Java的异常处理机制,Java的数据库连接技术,Java的多线程技术与动画制作以及Java的网络编程。...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
【内容简介】 《C++编程思想》 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与...
2. **面向对象编程**:系统采用纯面向对象的编程方式,利用Java语言的封装、继承和多态特性,提高了代码的可重用性和可维护性。 3. **数据库设计**:系统内置了多种数据库支持,包括MySQL、Oracle等主流数据库。...
StudyJavaJava Basics1.java 基础学习2.java变成思想和java核心技术整理3.java8等java新特性学习整理###Java编程思想第1章 对象导论1.1 抽象过程1.2 每个对象都有一个接口1.3 每个对象都提供服务1.4 被隐藏的具体...
b、编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、 执 行方法来完成功能。 c、封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装...
c++编程思想,PDF文件。书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
人民邮电出版社 “Java 编程思想” 第3版 机械工业出版社 教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 高 中 控制结构 高 高 易 数组 高 高 中...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
java编程think第4版完整源码加python测试框架,不难看出这是一本经典之作。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...