`
百合不是茶
  • 浏览: 346208 次
社区版块
存档分类
最新评论

java编程思想 -- 多态

阅读更多

向上转型和向下转型

面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。
父类:人    子类:男人
向上转型: 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();
	}
}

 实现没有搞清楚用继承设计到底讲的什么,求大神指教

 

 

0
0
分享到:
评论

相关推荐

    黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc

    黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc

    C++编程思想--全18章

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    Java编程思想第08章多态.ppt

    Java编程思想第08章多态.ppt

    java 编程思想 (多态,接口和内部类)

    java对象的引用,控制程序流,初始化和清除,封装,复用类,多态,接口和内部类,异常处理try——catch,类的检查,对象的集合,i/o系统,并发,分析与设计,对象的传递和返回

    C++编程思想(Thinking in C++中文版)

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    Java课程设计-21点小游戏.docx

    常用工具类与算法的实现(数组、向量、字符串、链表),java.awt、javax.swing中常用标准GUI组件及相应的事件处理,Java的异常处理机制,Java的数据库连接技术,Java的多线程技术与动画制作以及Java的网络编程。...

    C++编程思想(《Thinking in C++》,Bruce Eckel著)

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    Java课程设计-21点小游戏(2).docx

    常用工具类与算法的实现(数组、向量、字符串、链表),java.awt、javax.swing中常用标准GUI组件及相应的事件处理,Java的异常处理机制,Java的数据库连接技术,Java的多线程技术与动画制作以及Java的网络编程。...

    C++编程思想1-5 清晰PDF

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    C++编程思想.part1

    【内容简介】 《C++编程思想》 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与...

    Java毕业设计-JAVA SMART系统-系统框架设计与开发(源代码+论文)(1).rar

    2. **面向对象编程**:系统采用纯面向对象的编程方式,利用Java语言的封装、继承和多态特性,提高了代码的可重用性和可维护性。 3. **数据库设计**:系统内置了多种数据库支持,包括MySQL、Oracle等主流数据库。...

    StudyJava:Java 基础学习(java编程思想和java技术核心卷)

    StudyJavaJava Basics1.java 基础学习2.java变成思想和java核心技术整理3.java8等java新特性学习整理###Java编程思想第1章 对象导论1.1 抽象过程1.2 每个对象都有一个接口1.3 每个对象都提供服务1.4 被隐藏的具体...

    Java---面试宝典

    b、编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、 执 行方法来完成功能。 c、封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装...

    C++编程思想(入门学习)

    c++编程思想,PDF文件。书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与...

    《C++编程思想》面向对象

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    C++编程思想——学习C++的好书

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    AIC的Java课程1-6章

    人民邮电出版社  “Java 编程思想” 第3版 机械工业出版社  教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 高 中 控制结构 高 高 易 数组 高 高 中...

    c++经典编程思想教程

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    java编程think第4版完整源码加python测试框架

    java编程think第4版完整源码加python测试框架,不难看出这是一本经典之作。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O...

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

Global site tag (gtag.js) - Google Analytics