zoukankan      html  css  js  c++  java
  • java 多态

    先创建一个Person抽象类和两个接口IPaint、ISing用于继承和实现,如下

    package cn.sasa.demo2;
    //抽象类
    public abstract class Person {
    	private String name;
    	private int age = 1;
    	public int num = 1;
    	
    	public String getName() {
    		return this.name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public int getAge() {
    		return this.age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	public void sayHi() {
    		System.out.println("hi~");
    	}
    	
    	//抽象方法
    	public abstract void work() ;
    
    }
    

      

    package cn.sasa.demo2;
    
    public interface IPaint {
    
    	public abstract void paint();
    	
    }
    

      

    package cn.sasa.demo2;
    
    public interface ISing {
    
    	public abstract void sing();
    }
    

      

    然后准备两个普通类Teacher、Student继承和实现以上类和接口

    package cn.sasa.demo2;
    //继承了Person,实现了IPaint,ISing接口
    public class Teacher  extends Person implements IPaint, ISing{
    
    	@Override
    	public void sing() {
    		System.out.println("teacher is singing");
    	}
    
    	@Override
    	public void paint() {
    		System.out.println("teacher is painting");
    	}
    
    	@Override
    	public void work() {
    		System.out.println("teach");
    	}
    	
    	//本类特有的方法
    	public void exam() {
    		System.out.println("exam");
    	}
    	
    }
    
    package cn.sasa.demo2;
    //继承了Person,实现了IPaint接口
    public class Student extends Person implements IPaint{
    	private int age = 2;
    	public int getAge() {
    		return this.age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	public int num =2;
    	
    	@Override
    	public void paint() {
    		System.out.println("stu is painting");
    	}
    
    	@Override
    	public void work() {
    		System.out.println("study");
    	}
    	
    	//本类特有的方法
    	public void doHomework() {
    		System.out.println("do homework");
    	}
    
    }
    

      创建一个Test类测试:

    package cn.sasa.demo2;
    
    public class Test {
    	public static void main(String[] args) {
    		// 多态:一个类型的多种形态
    		// 实现多态两个关键点:
    		// 1、有继承或实现关系
    		// 2、子类重写父类的方法 或 子类实现接口
    
    		// 多态演示一:类的多态
    		Person stu = new Student();
    		Person tea = new Teacher();// 向上转型
    
    		// 成员变量,编译运行都看父类
    		System.out.println(stu.num);
    		// 成员方法,编译看父类,运行看子类,父类有此方法则编译成功,但运行时调用的是子类的方法
    		// 调用的都是work(),但执行的是子类各自的work()方法
    		System.out.println(stu.getAge());
    		stu.work();
    		tea.work();
    
    		// 多态演示二:接口的多态
    		IPaint teaPaint = new Teacher();
    		IPaint stuPaint = new Student();
    		teaPaint.paint();
    		stuPaint.paint();
    		// 以上将Student和Teacher向上转型成了Person或者接口IPaint
    		// 那么如果我们要调用子类特有的方法该怎么办?
    		// 方法:向下强转
    		// 子类类型 变量名 = (子类类型)父类变量
    		Teacher t = (Teacher) tea;
    		t.exam();
    		// 这里有个强转出现转错成其他类型的可能性,那么在强制转换前,先判断,这个类是不是某个子类
    		// 关键字:instanceof
    		if (tea instanceof Teacher) {
    			((Teacher) tea).exam();
    		}
    
    		if (stu instanceof Student) {
    			((Student) stu).doHomework();
    		}
    
    		// instanceof 同样可以判断接口
    		if (stuPaint instanceof ISing) {
    			((ISing) stuPaint).sing();
    		} else {
    			System.out.println("wrong type");
    		}
    
    		if (teaPaint instanceof IPaint) {
    			teaPaint.paint();
    		}
    	}
    }
    

      

  • 相关阅读:
    Android之剑法初略:dalvik vm和jvm比较
    人民币阿拉伯数字转换为汉字大写 code
    数据库定时备份方案及实践
    [postfix]添加黑名单
    [php][随机数]曲线式的随机
    记公司服务器维护经历
    批量修改符号链接实现思路
    复杂数组的签名生成方法
    [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选
    [已解决]centos6.4 php连接mysql和memcache提示权限不允许
  • 原文地址:https://www.cnblogs.com/SasaL/p/10000947.html
Copyright © 2011-2022 走看看