`
Luob.
  • 浏览: 1591878 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之8天 多态

    博客分类:
  • Java
阅读更多
多态

/**
 * 多态: 可以理解为事物存在的多种体现形态
 * 
 * 人:男人 女人 动物 : 猫,狗
 * 
 * 猫 x=new 猫(); 动物 x=new 猫();
 * 
 * 1.多态的体现
 *      父类的引用指向子类的对象
 *      父类的引用可以接受自己的子类对象
 * 2.多态的前提 
 *      类和类之前要有关系,要么继承,要么实现
 *      通常还有一个前提:存在覆盖.
 * 3.多态的好处 
 * 		多态的初相大大的提高程序的扩展性
 * 4.多态的弊端
 * 		提高了扩展性,但是只能使用父类的引用访问父类中的成员
 * 5.多态应用
 * 		
 * 6.多态出现代码中的特点(多态使用注意事项)
 * 
 * 
 */

abstract class Animal{
	public abstract void eat();
}

class Cat extends Animal{
	@Override
	public void eat() {
		System.out.println("吃鱼");
	}
	public void catchMouse(){
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal{
	public void eat() {
		System.out.println("啃骨头");
	}
	public void kanJia(){
		System.out.println("看家");
	}
}

class Pig extends Animal{

	public void eat() {
		System.out.println("饲料");
	}
	public void gondDi(){
		System.out.println("拱地");
	}
}
 
 
public class DuotaiDemo {
	public static void main(String[] args) {
		Cat c=new Cat();
		c.eat();
		Dog d=new Dog();
		d.eat();
		
		function(new Cat());
		function(new Dog());
		function(new Pig());
		
		
		// 父类的引用指向指向子类的对象
		Animal ac=new Cat();  //类型提升,向上转型  将猫转型 成父类型
		function(ac);
		
		Animal ad=new Dog();
		function(ad);
		
		//如果想要调用猫的特有方法时
		//强制父类的引用,装成子类型
		Cat cc=(Cat)ac;     //向下转型
		cc.catchMouse();
		
		
	}
	/*public static void function(Cat c){
		c.eat();
	}
	public static void function(Dog d){
		d.eat();
	}
	//一年后 养猪了 
	public static void function(Pig p){
		p.eat();
	}
	*/
	 
	//提高代码的扩展性   可以将下面的封装成一个 工具类 专门用来操作这一类对象的
	public static void function(Animal a){
		a.eat();
		
		//instanceof  :在子类是有限的时候可以判断 . 判断后 然后在应用其 特定的方法.
		if(a instanceof Cat)
			((Cat) a).catchMouse();
		else if(a instanceof Dog)
			((Dog) a).kanJia();
		else if(a instanceof Pig)
			((Pig) a).gondDi();
	}

//多态中成员的特点
/**
 * 多态中成员的特点 
 * 非静态成员函数: 成员函数在多态调用时,编译看着左边,运行看右边.
 * 
 * 成员变量: 都参考左边(应用类型所属的类)
 * 静态成员函数: 无论编译和运行 都参考左边
 * 
 */
class Fu {
	int num=5;
	static int num1=5;
	static final int num2=5;
	void method1() {
		System.out.println("Fu_method1");
	}

	void method2() {
		System.out.println("Fu_method2");
	}
	
	//静态
	static void method4() {
		System.out.println("Fu_method4");
	}
}

class Zi extends Fu {
	int num=8;
	static int num1=8;
	static final int num2=8;
	void method1() {
		System.out.println("Zi_method1");
	}

	void method3() {
		System.out.println("Zi_method3");
	}
	//静态
	static void method4() {
		System.out.println("Zi_method4");
	}
}

public class DuotaiDemo1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//方法
		Fu f=new Zi();
		f.method1();       //打印   Zi_method1
		f.method2();      //打印   Fu_method2
		//f.method3();编译失败
		f.method4();
		
		Zi z=new Zi();
		z.method1();       //打印   Zi_method1
		z.method2();      //打印   Fu_method2
		z.method3();     //打印   Zi_method3
		z.method4();
		
		
		//变量 
		Fu ff=new Zi();
		System.out.println(ff.num);     // 5
		System.out.println(ff.num1);    // 5
		System.out.println(ff.num2);    // 5
		
		Zi zz=new Zi();
		System.out.println(zz.num);    // 8
		System.out.println(zz.num1);  // 8
		System.out.println(zz.num2); // 8
		
		

	}


接口的特点
/**
 * 需求:
 * 电脑运行实例:
 * 电脑运行基于主板.
 * 
 * 多态应用
 * 接口:降低耦合性,提高程序的扩展性.提供了规则  
 */

class MainBoard1{
	public void run(){
		System.out.println("mainboard run");
	}
	//升级一
	public void userNetCard(NetCard1 c){
		c.open();
		c.close();
	}
}
//升级 一:要上网  怎么办?
class NetCard1{
	/**
	 * 发现 耦合性很高,如果要听音乐 ,需要 取下这个网卡 
	 */
	public void open(){
		System.out.println("NetCard open");
	}
	public void close(){
		System.out.println("NetCard close");
	}
}

//升级二 :要听音乐 (主板厂商 召集个功能卡开发商 开会 ,定义PCI插槽规则)
interface PCI{
	public void open();
	public void close();
}

class MainBoard{
	public void run(){
		System.out.println("mainBoard run");
	}
	
	public void userPCI(PCI p){  //接口的引用 执行 子类的对象
		if(p!=null){
			p.open();
			p.close();
		}
	}
}

class NetCard implements PCI{

	@Override
	public void open(){
		System.out.println("NetCard open");
	}
	@Override
	public void close(){
		System.out.println("NetCard close");
	}
}

class SoundCard implements PCI{
	
	@Override
	public void open(){
		System.out.println("SoundCard open");
	}
	@Override
	public void close(){
		System.out.println("SoundCard close");
	}
}



//测试
public class DuoTaiDemo2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MainBoard1 mb1=new MainBoard1();
		mb1.run();
		//升级一
		mb1.userNetCard(new NetCard1());
		
		//升级二
		MainBoard mb=new MainBoard();
		mb.run();
		mb.userPCI(null);
		mb.userPCI(new NetCard());
		mb.userPCI(new SoundCard());
	}

}



多态的应用三:

/**
 * 需求: 数据库的操作
 * 数据是:用户信息
 * 1.连接数据库
 * 2.操作数据库 JDBC  HIBERNATE
 * 	 CRUD
 * 3.关闭数据库连接
 */
//升级三
interface UserInfoDao{
	public void  add(User user);
	public void  delete(User user);
}

class UserInfoByJDBC implements UserInfoDao{

	public void add(User user){
		/*
		 * 1.JDBC连接数据库
		 * 2.使用sql添加语句添加数据
		 * 3.关闭连接 
		 */
		}
		
	public void delete(User user){
	/*
	 * 1.JDBC连接数据库
	 * 2.使用sql添加语句删除数据
	 * 3.关闭连接 
	 */
	}
	
}

//升级 1: 公司数采用  hibernate框架
class UserInfoByHibernate implements UserInfoDao{
	public void add(User user){
	/*
	 * 1.Hibernate连接数据库
	 * 2.使用sql添加语句添加数据
	 * 3.关闭连接 
	 */
	}
	
	public void delete(User user){
	/*
	 * 1.Hibernate连接数据库
	 * 2.使用sql添加语句删除数据
	 * 3.关闭连接 
	 */
	}
	
}

public class DuoTaiDemo4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UserInfoByJDBC ui=new UserInfoByJDBC();
		ui.add(user);
		ui.delete(user);
		
		//升级 1: 公司要求采用  hibernate框架   发现修改代码的时候还是挺麻烦的
		UserInfoByHibernate uh=new UserInfoByHibernate();
		uh.add(user);
		uh.delete(user);
		
		//采用多态
		UserInfoDao ud=new UserInfoByHibernate();
		ud.add(user);
		ud.delete(user);
	}

}


Object中 几个 常用的方法

/**
 *Object 是所有对象的直接或者间接父类.该类定义的肯定是所有对象 所有具备的功能
 *
 *Object 中已经提供了对象是否相同的比较方法,我们只需要重写
 */
class Demo //extends Object
{
	Demo(){
		super();//默认调用 Object
    }  
	private int num;
	
	Demo(int num){
		this.num=num;
	}
	public boolean compare(Demo d){
		return this.num==d.num;
	}

	//使用Object 的比较方法
	public boolean equals(Object obj){ // Object obj=new Demo();
		if(!(obj instanceof Demo)) //判断类型
			return false;
		Demo d=(Demo)obj;  //向下转型
		return this.num==d.num;
	}
	
	public String toString(){
		return "Demo"+num;
	}
}
class Person{
	
}

public class ObjectDemo {
	public static void main(String[] args) {
		System.out.println("========equals===========");
		Demo d1=new Demo(4);
		Demo d2=new Demo(5);  
		Demo d3=d1;
		
		System.out.println(d1.equals(d2));
		System.out.println(d1==d2);
		System.out.println(d1==d3);
		
		Person p=new  Person();
		System.out.println(d1.equals(p));
		
		System.out.println("========toString===========");
		System.out.println(d1.toString()); //打印 d1所属类型  和 在内存地址中的值
		System.out.println(Integer.toHexString(d1.hashCode())); 
		
		Class c=d1.getClass();
		System.out.println(c.getName());
		System.out.println(c.getName()+"@"+Integer.toHexString(d1.hashCode()));
		
		System.out.println(d1.toString());
		
	}

}
1
2
分享到:
评论

相关推荐

    08_Java基础语法_第8天(Eclipse)_讲义

    总结以上,"08_Java基础语法_第8天(Eclipse)_讲义"涵盖了Eclipse中使用Java基础语法的各个方面,从基本数据类型到面向对象编程,再到IDE的使用技巧。通过深入学习这些内容,开发者将能够高效地在Eclipse中进行Java...

    java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB.zip

    细品这杯香浓的咖啡——阿里中间件高级专家沈询的Java之旅.docx 给你一次机会面试架构师 你会问什么问题?.docx 超全面:程序员跳槽神级攻略.docx 跳还是不跳,是一个问题——跳槽时该如何权衡?.docx 进入IT企业...

    韩顺平30天学java

    12. **反射**:通过反射机制,可以在运行时动态地获取类的信息并操作对象,这是Java高级特性之一。 13. **泛型**:泛型提供了一种在编译时检查类型安全的方法,同时允许程序员编写更灵活的代码。 14. **Java API的...

    java100天速成

    Java编程语言以其强大的功能、跨平台的特性以及丰富的开源库,成为了全球软件开发者的首选工具之一。对于初学者来说,掌握Java技术可以打开许多职业发展机会。"Java100天速成"是一个专为新手设计的学习计划,旨在...

    Java100天速成

    在《Java100天速成》中,函数式编程也会被提及,这是Java 8引入的一个重要特性,包括Lambda表达式和流API。这些新工具大大简化了代码,提高了代码的可读性和可维护性。 此外,课程还会涵盖Java的标准库,例如 Swing...

    11-面向对象-第3天(接口多态)-讲义共6页.pdf.z

    本讲义“11-面向对象-第3天(接口多态)”深入探讨了面向对象中的两个关键特性:接口和多态。 首先,接口在面向对象编程中扮演着规范和契约的角色。接口定义了一组方法签名,但不包含任何实现。它允许不同的类遵循...

    黑马程序员_Java基础辅导班教程课件[第01期]第8天

    1. **面向对象编程(OOP)**:Java是一门面向对象的语言,第8天的课程可能会重点讲解OOP的四大特性——封装、继承、多态和抽象。封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式;继承允许一个类(子类)...

    java学习路线(鱼皮)

    * 视频:韩顺平 - 零基础 30 天学会 Java * 文档:菜鸟教程 - Java 教程 * 书籍:《Head First Java》 * 在线游戏:Codegym * 视频:宋红康 - 全网最全 Java 零基础入门教程 * 文档:菜鸟教程 - Java 8 新特性 * ...

    java 15天教程下载,可供java初学者学习使用

    1 拓薪教育-计算机基础初识JAVASE.docx 10 第10天eclipse的使用和异常处理.docx 11 JAVASE第11天字符串.docx ...8 J2SE之接口和多态.docx 9 JAVASE第九天.docx 9 JAVASE第九天1.docx java文档整合.docx

    21天学通java英文版(pdf格式)

    Java编程语言是世界上最流行的编程语言之一,以其跨平台、面向对象和强大的库支持而闻名。"21天学通Java英文版"是一本旨在帮助初学者在短时间内掌握Java核心技术的教程。通过21天的学习计划,这本书将引导读者从基础...

    21天学通java(英文版).pdf格式

    2. **面向对象**:Java强调封装、继承和多态等面向对象的特性,适合大型软件的开发。 3. **安全性**:Java设计了许多安全机制,防止恶意代码对系统造成破坏。 4. **健壮性**:Java有严格的类型检查和异常处理机制,...

    java基础18天Typora笔记

    Java基础18天 Typora笔记概述 这是一份专为Java初学者准备的学习资源,由魔乐科技提供,旨在帮助用户在18天内建立起坚实的Java编程基础。Typora是一款简洁而高效的Markdown编辑器,使得笔记整理和阅读更加便捷。...

    java学习16天java学习java学习16天java学习

    "java学习16天"可能是指一个为期16天的Java编程学习计划,旨在帮助初学者快速掌握Java基础并深入理解其核心概念。在这个过程中,学习者通常会涉及以下几个关键知识点: 1. **Java基础知识**:首先,学习Java需要...

    21天学会Java--教案

    第8-10天:数组和集合框架 数组是存储相同类型元素的固定大小的序列,而集合框架则是更灵活的数据结构,如ArrayList、LinkedList、HashSet、HashMap等。学习者将学习如何声明、初始化和操作数组,以及如何使用集合...

    21天学通java6(第5版).pdf

    - 面向对象:Java支持封装、继承和多态三大面向对象的特性。 - 健壮性:Java有异常处理和垃圾回收机制,增强了程序的健壮性。 - 安全性:提供了安全管理器和类加载器等机制,用于保护应用程序不受恶意代码的攻击。 -...

    21天学好JAVA

    8. **JAVA Swing和JavaFX**:学习如何使用JAVA创建图形用户界面(GUI),掌握Swing组件库的使用,或者更现代的JavaFX技术。 9. **JAVA网络编程**:理解网络编程基础,学习Socket通信,以及如何使用HTTP协议进行网络...

    满天星星java源程序

    2. **类与对象**:Java是面向对象的语言,所以理解类的定义、对象的创建以及封装、继承和多态等面向对象特性至关重要。 3. **方法**:方法是Java中的功能模块,用于封装代码。学习如何定义和调用方法,理解参数传递...

    27天成为Java大神之Day02

    在"27天成为Java大神之Day02"的学习旅程中,我们开始深入Java的世界。这个阶段,我们将重点理解Java的基础概念,为后续的高级主题打下坚实的基础。Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现...

    21天学通java的源代码

    《21天学通Java》是一本面向初学者的编程教程,旨在帮助读者在短时间内掌握Java编程基础。这本书由庞永庆、庞丽娟等人编著,提供了丰富的实例和实践练习,以帮助学习者深入理解Java语言的核心概念。源代码是书中各个...

    21天精通java源代码

    8. **Java标准库**:熟悉Java的API,如IO、NIO、网络、XML解析、日期时间处理等。 9. **泛型**:泛型提高了代码的类型安全性和重用性,是Java 5引入的重要特性。 10. **注解**:注解用于提供元数据,可以被编译器...

Global site tag (gtag.js) - Google Analytics