在我前面的一篇文章中,有写到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++编程语言中,动态绑定和静态绑定是两种关键的多态实现方式,它们对于理解和编写高效、灵活的代码至关重要。多态性允许我们通过一个共同的基类接口访问不同派生类的对象,从而提高了代码的重用性和可扩展性。 ...
1、讲解和演示动态绑定与静态绑定的概念与原理; 2、讲解和演示虚析构函数的概念与原理,并讲解为什么构造函数不能使用虚函数的原因;
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、...
C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分。 我是在一个类的继承体系中分析的,因此下面所说的对象一般是指一个类的实例。 首先我们需要明确几个名词定义: 静态...
本篇文章将详细讲解如何在C++中调用WebService,包括静态和动态方式,并探讨相关的源码实现。 首先,让我们理解什么是WebService。WebService是一种基于XML的开放标准,允许不同平台和应用程序之间进行互操作。它...
"LibraryLoad"可能是包含示例代码或示例项目,演示如何在C++项目中加载和使用静态库与动态库。实际操作时,需要根据项目需求和平台特性选择合适的库类型,并遵循上述步骤进行库的创建和使用。 总之,理解并熟练掌握...
我对于C++动态绑定的理解,一句话,是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态 智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,...
如果直接调用对象的成员函数(如`b1.costMoney()`),则会执行静态绑定(早期绑定),即编译器在编译期间就已经确定了函数的调用版本。 动态绑定的一个常见陷阱是不使用虚析构函数。在给定的示例代码中,`Base`和`...
这种机制被称为动态绑定或运行时多态,与静态绑定(编译时多态)相对。下面我们将深入探讨虚函数的原理及其在C++中的实现方式。 首先,每个包含虚函数的类都会有一个虚函数表(vtable),这个表存储了类中所有虚...
标题提到的是“librdkafka 动态库 静态库”,这表明我们讨论的核心是librdkafka,一个开源的Apache Kafka C/C++客户端库,它提供了生产者和消费者API,支持高吞吐量的消息传递。动态库和静态库是两种不同的库文件...
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...
Lua是动态类型的,而C++是静态类型的,因此在两者之间传递复杂数据结构时需要进行类型转换。此外,C++支持异常处理,但Lua不直接支持,所以需要在绑定时考虑如何适当地捕获和处理异常。最后,由于Lua和C++的内存管理...
在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...
3. 动态和静态绑定:C++ 支持动态绑定(运行时绑定)和静态绑定(编译时绑定)。动态绑定通过虚函数实现,增加了代码的灵活性;静态绑定则在编译阶段确定,有利于提高效率。 4. 异常处理:C++ 提供了异常处理机制,...
文章中通过实例说明了C++中静态绑定与Objective-C中动态绑定的不同。 C++是一种静态类型语言,意味着变量的类型在编译时就已经确定,编译器会使用类型信息来检查程序中的错误,并为程序生成具体的机器码。C++的多态...
标题中的“一个基于C++17的lua绑定库”指的是使用C++17标准实现的与Lua脚本语言交互的库。这样的库允许C++程序调用Lua脚本中的函数,同时也让Lua能够访问和操作C++的对象和数据。Lua绑定库在游戏开发、自动化工具和...
6. **编译和集成**:生成的Lua绑定代码需要编译成静态库或动态库,并链接到游戏项目中。同时,将生成的lua文件添加到项目资源中,以便在游戏中加载和使用。 7. **测试和调试**:在Lua脚本中引用生成的绑定,测试C++...
1.继承的本质和原理 2.派生类的构造类型 ...4.静态绑定和动态绑定 5.多态 vfptr和vftbale 6.抽象类的设计原理 7.多继承以及问题 8.虚基类 vbptr和vbtable 9.RTTI 10.C++四种类型强转 11.继承多态常见笔试面试题分享