C++与Java类和对象的异同

前言

面向对象编程 (Object-Oriented Programming, OOP),是一种基于对象的编程思想,C++和Java语言都是具有这样特性的编程语言。本文用于介绍C++和Java类和对象部分的区别。

异同

1.类的定义

类是对象的蓝图,用于定义对象的行为和属性,两种语言使用相同的关键字class定义类。需要注意的是:c++在类的定义之后需要加上分号,而java则不用。

cpp 复制代码
class MyClass{
    //c++类定义示例
    int num=114514;
    void setNum(int n){
        num=n;
    }
};
java 复制代码
class MyClass{
    //Java类定义示例
    int num=114514;
    void setNum(int n){
        num=n;
    }
}

2.类的创建

两种语言中,类都通过new关键字进行实例化,对象的创建方式相同,但语法略有不同。

cpp 复制代码
// C++ 对象创建
MyClass* obj = new MyClass();
obj->setNum(10);
java 复制代码
// Java 对象创建
MyClass obj = new MyClass();
obj.setNum(10);

3.成员函数和成员变量

两种语言都允许类包含成员函数(方法)和成员变量(字段),并且都通过public(公共),private(私有)和protected(保护)三种关键字控制成员的权限,但在语法上有所不同。

cpp 复制代码
// C++ 成员函数和成员变量
class MyClass {
public:
    int publicNum;
private:
    int privateNum;
public:
    void setPrivateNum(int n) {
        privateNum = n;
    }
};
java 复制代码
// Java 成员函数和成员变量
class MyClass {
    public int publicNum;
    private int privateNum;
    public void setPrivateNum(int n) {
        privateNum = n;
    }
}

4.构造方法

构造方法用于初始化类的对象,两种语言都支持默认构造函数,构造函数的重载,this关键字等用法。

c++支持初始化列表:

cpp 复制代码
class Person {
public:
    int age;
    Person() : age(0) {} // 默认构造函数
    Person(int a) : age(a) {} // 带参数的构造函数
};

而在 Java 中,构造方法也用于初始化对象,但 Java 不支持初始化列表,所有成员变量的初始化必须在构造方法体内完成。此外,Java 的构造方法名称必须与类名相同。

java 复制代码
class Person {
    int age;
    Person() {
        this.age = 0; // 默认构造方法
    }
    Person(int a) {
        this.age = a; // 带参数的构造方法
    }
}

5.静态成员变量

两种语言都支持静态成员变量,这是一种属于类而不属于特定对象的变量。

在c++中,静态成员变量只能在类外完成定义并初始化。

cpp 复制代码
class MyClass {
public:
    static int count;
};
int MyClass::count = 0; // 类外定义和初始化

在Java中,静态成员变量直接在类中完成定义并初始化。

java 复制代码
class MyClass {
    static int count = 0; // 直接定义和初始化
}

6.代码块

在 Java 中,除了普通代码块外,还支持静态代码块和实例代码块。静态代码块用于类加载时的初始化操作,而实例代码块则在每次创建对象时执行。

java 复制代码
class MyClass {
    static {
        System.out.println("静态代码块执行"); // 静态代码块
    }

    {
        System.out.println("实例代码块执行"); // 实例代码块
    }
}

而在 C++ 中,代码块通常用于局部作用域的控制或条件分支中的代码执行。C++ 支持匿名命名空间来实现类似 Java 静态代码块的功能。

cpp 复制代码
namespace {
    int initStaticData() {
        return 10;
    }
}

示例代码

cpp 复制代码
#include <iostream>
using namespace std;

class Person {
//公共权限
public:
    int age;
    static int count;//静态成员变量
    Person() : age(0) { count++; }
    Person(int a) : age(a) { count++; }
    //初始化列表
};

int Person::count = 0;

int main() {
    Person p1, p2(25);
    cout << "Total persons: " << Person::count << endl;
    return 0;
}
java 复制代码
class Person {
    int age;
    static int count = 0;//静态成员变量
    
    //不带参数的构造方法
    Person() {
        this.age = 0;
        count++;
    }

    //带参数的构造方法
    Person(int a) {
        this.age = a;
        count++;
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person(25);
        System.out.println("Total persons: " + Person.count);
    }
}
相关推荐
wewowilling17 分钟前
认识微服务
java·运维·微服务·springcloud
代码什么用37 分钟前
Java Web 7-10
java·servlet
沫璃染墨44 分钟前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
达子6661 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南2 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀2 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
tachibana22 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
蜗牛互联网2 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
临床数据科学和人工智能兴趣组3 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go3 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型