文档章节

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
西安
程序员
私信 提问
Java程序员从笨鸟到菜鸟之(三)面向对象之封装,继承,多态(下)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 上接:Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上) 五:再谈继承 继承是一种联结类的层...

长平狐
2012/11/12
106
0
05-《深度拆解JVM》之JVM是如何执行方法调用的?(下)

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

飞鱼说编程
09/25
0
0
115个Java面试题及回答

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

Yamazaki
2014/04/25
0
0
多态在 Java 和 C++ 编程语言中的实现比较

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

Jerikc
2013/12/03
0
1
Java入门需掌握的30个基本概念

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

风一样
2011/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

进程管理利器Supervisor--centos7下安装与卸载

目录 概述 环境准备 检查python环境 在线安装 配置Supervisor 启动并验证 概述 Supervisor的安装可以有在线安装和离线安装两种方式。安装方式取决于服务器是否联网,联网的话可采用在线安装,...

java_龙
14分钟前
2
0
spring系列汇总

spring spring-基于可扩展Schema的特性自定义标签 springmvc-同一个访问资源,多种视图解析方式 spring cache 配置使用aspectj模式织入 基于注解的spring缓存,轻松无侵入解决cache问题 spri...

细肉云吞
14分钟前
1
0
vsftpd搭建ftp

12月10日任务 14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp exportfs命令 在nfs运行后的一段时间内,如果需要添加共享目录,这时需要修改exports文件,并...

robertt15
17分钟前
2
0
numpy常用操作

水平合并数组 import numpy as npa = [1,2,3]b = [4,5,6]np.hstack((a,b))# array([1, 2, 3, 4, 5, 6])c = [a,['a','b','c']]d = [b,['d','e','f']]np.hstack((c,d))#array([['1'......

datadev_sh
33分钟前
4
0
四种检测异常值的常用技术简述

摘要: 本文介绍了异常值检测的常见四种方法,分别为Numeric Outlier、Z-Score、DBSCAN以及Isolation Forest 在训练机器学习算法或应用统计技术时,错误值或异常值可能是一个严重的问题,它们...

阿里云官方博客
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部