Java与C++在面向对象部分的不同

目录

一.类与对象

1.类定义与实现

2.对象声明与创建

3.成员访问权限

二.继承

1.子类与父类

2.成员变量的继承性

3.子类调用被隐藏的父类方法

三.多态  

1. 静态绑定、动态绑定(C++)与对象的上转型对象(Java)

2.抽象类

3.接口


Java和C++都是面向对象的编程语言,C++和Java诞生时代的不同也造成他们在面向对象部分的不同,今天我就为大家简单介绍它们之间的不同。

本人Java还在学习中,掌握的不是很到位,本篇文章存在较多错误之处,望各位发现后指出,感谢大家的观看。

一.类与对象

1.类定义与实现

Java和C++在类的定义上没有什么不同(自我感觉上),只是Java所有代码都是放在类里面,因此成员函数不像C++那样可以在类外定义

2.对象声明与创建

C++中声明对象的同时也就创建了对象,Java声明了对象后并没有为对象分配内存空间,需使用new 运算符创建对象(对象名是一个引用),但是C++中对象名就是对象,不是指针。new运算符得出的指针不能赋值给左边的对象。

3.成员访问权限

C++有四种种成员访问权限(从低到高排序):private、protected、public,默认为private,此外还有一种friend,但是只能用来修饰外部函数,使被修饰的外部函数能够访问内部私有成员。Java中也有有四种(按访问权限从低到高排序):private、default、protected、public,默认为default(友好的),可以看出default更偏向私有,对象和创建这个对象的类在同一包(用package 目录.子目录… 表示包,对象所在类和创建对象的类的字节码文件都在这个目录下,类似于C++中的头文件,但可以独立运行)中(或字节码在同一目录下),对象才能访问自己的成员。

二.继承

1.子类与父类

C++支持多重继承,即一个子类拥有多个父类,但是Java中一个子类只能有一个父类(但父类可以有多个子类)。

2.成员变量的继承性

C++语言在进行子类声明是就声明子类的继承性,若是public。自然继承除了private以外的所有成员;protected继承除了private以外的成员,并将访问权限变为protected;private则是继承除private以外的,并将访问权限变为private。

Java语言的要求比较复杂,我总结了一下:

(1).父类private成员不能被子类访问,但是可以使用父类公有方法访问。

(2).default成员需要子类和父类在同一个包中才能被子类访问,不在同一包中也可以使用public方法访问。

(3).protected大部分可以被子类访问,但是使用其他类创建子类对象时,要找到父类,因此这个“其他类”必须和父类在同一包中。

(4)public在任意情况下都可访问。

3.子类调用被隐藏的父类方法

C++使用“父类名::函数名(参数表)”的形式调用被隐藏的父类函数。

Java使用“super.方法名(参数表)”的形式调用被隐藏的父类方法。

三.多态  

1. 静态绑定、动态绑定(C++)与对象的上转型对象(Java)

这里我也比较晕,需要严格区分子类函数和父类函数。在C++中,可以用子类的构造函数为父类创建对象,这时父类对象调用的函数是父类的函数。例如B是A的子类,A *a=new B(),用子类B的构造函数为A创建对象,如果A有一个成员函数test(),子类重写了这个test(),那么A.test()调用的是A的test()。利用这种形式定义对象,对象调用的函数是“=”左边的类的函数,这中调用函数的规则被称为“静态绑定”,即不论调用哪个类的构造函数,调用的都是声明指针的类的函数。将被重写的父类函数声明前加上关键字virtual,变为虚函数。这样调用的就是父类的函数,这被称为“动态绑定”,调用的函数是“=”右边的类的函数,即根据调用的构造函数所属类进行函数的调用。父类指针不能调用子类新增函数

Java中将子类对象赋值给父类对象,这时的父类对象叫做“上转型对象”,上转型对象调用的方法是子类的方法,沿用上面的例子A a=new B(),(注意Java中没有指针类型只有引用类型,对象名自带有引用类型)。A.test()调用的是子类重写的test()。如果只有子类拥有方法test(),那么A无法调用子类的方法test()。即上转型对象无法调用子类新增的方法或成员

2.抽象类

主要是两种语言的定义方式,C++中的抽象类只有成员变量和纯虚函数,纯虚函数的定义形式是“virtual 返回类型 函数名(参数表)=0;”,在抽象类中可以有多个。抽象类常被用作接口,用上文“动态绑定”的方式实现对重写函数的调用(抽象类中只有纯虚函数,被子类重写后,调用的是子类重写后的函数)。

Java中用abstract关键字修饰的,并且只有方法的定义,没有实现的类叫做抽象类。用关键字abstract修饰的方法叫做抽象方法,抽象类中必定含有抽象方法,非抽象方法(不用abstract修饰)可有可不有,但都不允许实现,即给出方法体。abstract方法只存在于抽象类中

子类若没有完全实现这些方法,那么也必须声明成抽象类(若是继承,抽象方法只能存在于抽象类中,那么这个类就必须是抽象类)。实现这些方法要去掉关键字abstract,给出方法体。用上转型对象实现对这些重写方法的调用。

3.接口

和上述Java中抽象类相比,接口中的数据成员必须是常量(public final static),方法必须是抽象方法(public abstract),(可以省略public、static、abstract、final这些关键字,注意abstract不能修饰数据成员,final和static不能修饰抽象方法,这里的final类似于C++中的const,一旦修饰的变量初始化后就不可被修改)

实现接口的类(可以理解为给出方法体的子类)用“实现的子类名implements 接口名{……}”的形式。

要想使用实现接口的类中重写的方法,使用一种叫做“接口回调”的技术方法和上述“上转型对象”类似,只是右边声明该对象的是接口名。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值