`
banxi1988
  • 浏览: 151984 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

C++PKJava的动态绑定与静态绑定

阅读更多
在我前面的一篇文章中,有写到C++的静态绑定和动态绑定.期间遇到了很多问题.
而用Java的话,可以很轻松的实现所要的需求.
但是...
/**
 * @time 上午10:23:34
 * @fileName TestStaticDynamicBinding.java
 * @package  me.banxi.oo
 */
package me.banxi.oo;

class Figure{
	public static final String name = "Figure";

	public Figure(){
		
	}
	public double area(){
		return 0.0;
	}

}
class Circle extends Figure{
	public static final String name = "Circle";
	private double _radius;
	public Circle() {
		
	}
	public Circle(double radius){
		_radius = radius;
	}
	public double area(){
		return Math.PI*_radius*_radius;
	}
}

class Rectangle extends Figure{
	public static final String name = "Rectangle";
	private double _length;
	private double _width;
	
	public Rectangle(){
		
	}
	public Rectangle(double length,double width){
		_length = length;
		_width = width;
	}
	
	public double area(){
		return _length*_width;
	}
}
/**
 * @author banxi1988
 */
public class TestStaticDynamicBinding {

	static void printArea(Figure figure){
		System.out.println(figure.name+"的面积是:"+figure.area());
	}
	
	public static void main(String[] args) {
		Figure figure = new Figure();
		printArea(figure);
		
		Circle circle = new Circle(2.0);
		printArea(circle);
		
		Rectangle rect = new Rectangle(3.0,4.0);
		printArea(rect);

	}

}
/**
 *
banxi1988@banxi:~/cppworkspace/C++_pk_Java/bin$ java me.banxi.oo.TestStaticDynamicBinding
Figure的面积是:0.0
Figure的面积是:12.566370614359172
Figure的面积是:12.0
banxi1988@banxi:~/cppworkspace/C++_pk_Java/bin$ 

 ***/

由此可见Java中类成员方法都是动态绑定的.
但是类中静态成员还是静态绑定的.
经过测试发现,对于类的中字段属性,也是静态绑定的..
所以就算我把name声明改成下面的,最后结果输出的还是Figure.
public  final String name = "Circle";


修改后如下,完成,静态绑定:
/**
 * @time 上午10:23:34
 * @fileName TestStaticDynamicBinding.java
 * @package  me.banxi.oo
 */
package me.banxi.oo;

class Figure{
	private static final String name = "Figure";

	public Figure(){
		
	}
	public String getName(){
		return name;
	}
	
	public double area(){
		return 0.0;
	}

}
class Circle extends Figure{
	private static  final String name = "Circle";
	private double _radius;
	public Circle() {
		
	}
	public Circle(double radius){
		_radius = radius;
	}
	public String getName(){
		return name;
	}
	
	public double area(){
		return Math.PI*_radius*_radius;
	}
}

class Rectangle extends Figure{
	private static final String name = "Rectangle";
	private double _length;
	private double _width;
	
	public Rectangle(){
		
	}
	public Rectangle(double length,double width){
		_length = length;
		_width = width;
	}
	public String getName(){
		return name;
	}
	
	public double area(){
		return _length*_width;
	}
}
/**
 * @author banxi1988
 */
public class TestStaticDynamicBinding {

	static void printArea(Figure figure){
		System.out.println(figure.getName()+"的面积是:"+figure.area());
	}
	
	public static void main(String[] args) {
		Figure figure = new Figure();
		printArea(figure);
		
		Circle circle = new Circle(2.0);
		printArea(circle);
		
		Rectangle rect = new Rectangle(3.0,4.0);
		printArea(rect);

	}

}
/**
 *
banxi1988@banxi:~/cppworkspace/C++_pk_Java/bin$ java me.banxi.oo.TestStaticDynamicBinding
Figure的面积是:0.0
Circle的面积是:12.566370614359172
Rectangle的面积是:12.0
banxi1988@banxi:~/cppworkspace/C++_pk_Java/bin$ 
 ***/

下面测试一下Java中同类中构造函数的调用.
如下,将Rectangle类的name属性.写成下面的形式:
	private static final String name;//error
	private double _length;
	private double _width;
	
	public Rectangle(){
		name = "Rectangle";
	}
	public Rectangle(double length,double width){
		this();
		_length = length;
		_width = width;
	}
	public String getName(){
		return name;
	}
	

上面有一句语句是有错的,就是static final同时修改的字段.name没有直接初始化.
就违反了Java中上述两个修饰的属性了.
支持任意一个都可以.
修改后如下:
class Rectangle extends Figure{
	private  static String name;
	private double _length;
	private double _width;
	
	public Rectangle(){
		name = "Rectangle";
	}
	public Rectangle(double length,double width){
		this();
		_length = length;
		_width = width;
	}
	public String getName(){
		return name;
	}
	
	public double area(){
		return _length*_width;
	}
}

总结Java中的方法是动态绑定的.而字段则是静态绑定.
在Java中可以直接对字段,进行初始化.
而C++中则静态属性字段要在类外部初始化.实例属性字段要在构造函数中初始化.
而且在C++中调用同一类中构造函数好像没有java中的this()机制.
如果在C++中直接调用另一个构造函数的话,生成了另一个隐藏的对象.
分享到:
评论

相关推荐

    深入理解C++的动态绑定和静态绑定

    深入理解C++的动态绑定和静态绑定 静态绑定:绑定的对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。 动态绑定:绑定的对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在...

    吕鑫:【C++语法与数据结构第22天】【第3堂课】动态绑定与静态绑定(面试题)

    1、讲解和演示动态绑定与静态绑定的概念与原理; 2、讲解和演示虚析构函数的概念与原理,并讲解为什么构造函数不能使用虚函数的原因;

    深入理解C++的动态绑定与静态绑定的应用详解

    为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、...

    C++中的静态绑定和动态绑定

    C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分。  我是在一个类的继承体系中分析的,因此下面所说的对象一般是指一个类的实例。  首先我们需要明确几个名词定义:  静态...

    如何理解C++中的动态绑定

     我对于C++动态绑定的理解,一句话,是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态  智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,...

    C++实现动态绑定代码分享

    对于C++动态绑定的理解,就是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态智能执行正确虚拟函数的技术。要彻底理解动态绑定,只需要掌握两点,一是编译器的静态编译过程,二是虚拟函数的基本知识...

    C++的静态联编和动态联编详解

    静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型,C语言中,...

    详解C++虚函数的工作原理

    静态绑定与动态绑定 讨论静态绑定与动态绑定,首先需要理解的是绑定,何为绑定?函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。 理解了绑定后再理解静态与动态。 静态绑定:指在程序...

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数是C++语言引入的一个很重要的特性,它提供了“动态绑定”机制,正是这一机制使得继承的语义变得相对明晰。 (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就...

    用ARP实现IP与MAC地址的绑定

    vc用ARP实现IP与MAC地址的绑定

    C++ CLI In Action(1)

    什么是 C++/CLI 个人感觉将其看作是位于静态程序设计和动态程序设计之间的一座桥梁。...据此,对于“什么是 C++/CLI ”这一问题可能的一种答案便是“它是对静态 C++ 对象模型和动态 CLI 组件模型的一种绑定”。

    C++ CLI In Acton

    什么是 C++/CLI 个人感觉将其看作是位于静态程序设计和动态程序设计之间的一座桥梁。...据此,对于“什么是 C++/CLI ”这一问题可能的一种答案便是“它是对静态 C++ 对象模型和动态 CLI 组件模型的一种绑定”。

    C++对象模型总结

    C++对象模型 第1章 关于对象 第2章 构造函数语意学 第3章 Data语意学 第4章 Function语意学 第5章 构造、析构、拷贝语意学 ...8.5.2 静态绑定与动态绑定 8.5.3 函数成员访问 8.5.4 多态的实现 8.5.5 虚析构函数

    详解C++ 多态的两种形式(静态、动态)

    静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的。静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态...

    C_C++问题总结

    C/C++问题总结 1. 关键字 1.1 const 1.1.1 常量 1.1.2 修饰指针 ...3.18 动态绑定和静态绑定 3.19 实现不能在堆、栈分配的类,不能被继承的类 3.20 堆和栈 3.20.1 程序内存分配 3.20.2 堆和栈 3.20.3 栈溢出

    C++中的静态多态和动态多态

    的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural)... C++支持多种形式的多态,从表现的形式来看,有虚函数、模板、重载等,从绑定时间来看,可以分成静态多态和

    C++多态性与虚函数

    第9章 多态性与虚函数 本章学习要求: 虚函数 多态性 静态与动态联编 9.1 多态性的概念 9.2 虚函数 9.3 静态绑定与动态绑定 9.4 纯虚函数和抽象类

    C++Primer视频(高级)下载地址

    26.15章 动态绑定 27.15章 三种继承 28.15章 派生类的构造函数和析构函数 29.15章 转换与继承 30.15章 友元与继承 31.15章 静态成员与继承 32.15章 纯虚函数与抽象类 33.16章 模板与泛型编程 34.16...

Global site tag (gtag.js) - Google Analytics