文档章节

java之动态绑定(多态)、抽象类、接口【6】

kongjunli
 kongjunli
发布于 2016/08/12 19:18
字数 594
阅读 3
收藏 0

一、动态绑定

指在执行期间(run,分配内存)而非编译期间判断所引用对象的实际类型,根据实际类型调用相关方法。

其存在的必要条件

  • 要有继承
  • 要有重写
  • 父类引用指向子类对象

 

package practice;
class Animal{
	private String name;
	Animal(String name){
		this.name=name;
	}
	public void enjoy(){
		System.out.println("叫声........");
	}
}
class Cat extends Animal{
	private String eyescolor;
	Cat(String name,String color){
		super(name);
		this.eyescolor=color;
	}
	public void enjoy(){
		System.out.println("猫叫.........");
		
	}
}
class Dog extends Animal{
	private String furcolor;
	Dog(String name,String color){
		super(name);
		this.furcolor=color;
	}
	public void enjoy(){
		System.out.println("狗叫。。。。。。");
	}
}
class Lady{
	private String name;
	Animal pet;
	Lady(String name,Animal animal){
		this.name=name;
		this.pet=animal;
		
	}
	public void myPetEnjoy(){
		pet.enjoy();//根据new的对象来决定调用哪一个方法
	}
}
public class TestLady {
public static void main(String args[]){
	Cat cat=new Cat("mimi","black");
	Dog dog=new Dog("wangwang","white");
	Lady l1=new Lady("lili",cat);
	Lady l2=new Lady("wenwne",dog);
	l1.myPetEnjoy();
	l2.myPetEnjoy();
}
}
结果:猫叫.........
狗叫。。。。。。

共有三个enjoy()函数,所以myPetEnjoy()函数中具体调用哪一个enjoy()函数由new的对象来决定

二、抽象类及抽象方法

  • 抽象方法类似c++中的纯虚函数
  • 含有抽象方法的类必须声明为抽象类
  • 抽象类不能被实例化,也可以理解为没有构造函数,抽象方法必须被重写
package practice;
abstract class Animal{

    abstract void getinfo();
}
class Pig extends Animal{
	private String name;
	private int height;
	private int weight;
	Pig(String name, int height, int weight) {
		this.name=name;
		this.height=height;
		this.weight=weight;
	}
	

	void getinfo(){
		System.out.println("name:"+name+" "+"height:"+height+" "+"weight:"+weight);
	}
}
public class _abstract {
public static void main(String args[]){
	Pig pig=new Pig("lulu",20,30);
	pig.getinfo();
}
}
结果:name:lulu height:20 weight:30

三、接口

class<name>extends<superclass>implements<interfacename>

  • 一种特殊的抽象类
  • 只包含public static final常量和抽象方法,但是abstract可以省略

接口特性:

  • 多重实现(一个类可以实现多继承)
  • 接口中只能定义抽象方法,而且这些方法只能默认为public
  • 接口可以继承其他接口
    package practice;
    interface Singer{
    	public  int age=20;
    	public void sing();
    	public void sleep();
    }
    interface  Painter{
    	public int age=30;
    	public void paint();
    	public void sleep1();
    }
      class People implements  Singer,Painter{
    
    	@Override
    	public void sing() {
    		// TODO Auto-generated method stub
    		System.out.println("I'm singing......");
    	}
    
    	@Override
    	public void sleep() {
    		// TODO Auto-generated method stub
    		System.out.println("I'm sleep......");
    		
    	}
    	@Override
    	public void paint() {
    		// TODO Auto-generated method stub
    		System.out.println("I'm sleeping....");
    	}
    
    	@Override
    	public void sleep1() {
    		// TODO Auto-generated method stub
    		System.out.println("You are sleeping...");
    	}
    	
    }
    public class TestInterface {
    public static void main(String args[]){
    	People people=new People();
    	people.sing();
    	people.sleep();
    	people.paint();
    	people.sleep1();
    }
    结果:I'm singing......
    I'm sleep......
    I'm sleeping....
    You are sleeping...
    

     

© 著作权归作者所有

共有 人打赏支持
kongjunli
粉丝 0
博文 25
码字总数 7291
作品 0
西安
程序员
05-《深度拆解JVM》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
09/25
0
0
多态在 Java 和 C++ 编程语言中的实现比较

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对...

Jerikc
2013/12/03
0
1
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0
Java入门需掌握的30个基本概念

(1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。 (2)分布...

风一样
2011/08/03
0
0
「JAVA基础」面向对象的特征有哪些方面

老师为大家整理JAVA基础:面向对象的特征有哪些方面 面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关...

启示录是真的
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java动态代理之InvocationHandler最简单的入门教程

网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,...

JerryWang_SAP
27分钟前
0
0
oracle 在 MyBatis 中使用 like

两种使用方法 使用oracle自带 || 拼凑的方式 <if test="userName!=null and userName!=''"> AND u.USER_NAME like '%' || #{userName} || '%' </if> 使用MyBatis的$符号的方式 <if test="us......

karma123
32分钟前
1
0
带接口的webservice方式发布

package cn.it.ws.e;import javax.jws.WebService;/** * 面向接口的webservice发布方式 * @author Administrator * */@WebServicepublic interface JobService {publi...

江戸川
48分钟前
2
0
day122-20181020-英语流利阅读-待学习

蜘蛛侠新片《毒液》来袭!导演灵感来自哪? Roxy 2018-10-20 1.今日导读 你还记得漫威宇宙中飞檐走壁的蜘蛛侠小可爱吗?在刚过去的国庆黄金周里,索尼影业发行的漫威超级英雄蜘蛛侠系列大片《...

飞鱼说编程
58分钟前
4
0
美团点评Docker容器管理平台

美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”)。该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台。目前该平台为...

Skqing
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部