构造函数、重载、传递

本文详细介绍了Java中的构造方法,包括其定义方式、特点及如何使用构造方法为对象成员变量进行初始化赋值。此外,还讲解了方法重载的概念及其在构造方法中的应用。
  public class QLZ{
String name;//定义姓名
}
public class Main{
public static void main(String [] args){
SWZ S1=new QLZ();
Q1.name=("侵略者");//创建一个对象,并赋予名字
}
可以看到,在类QLZ中,并没有看到创建对象的方法,但在Main中却可以直接创建一个对象。其实并不是不存在创建对象的方法,它是隐藏起来的默认存在的。这一种在创建对象的时候调用的用来构造对象的方法,其就是构造方法。可以将其理解为一种特殊的方法,下面是定义方式:
class类名称{
访问权限 类名称(类型1 参数1,类型2 参数2,......)
}
可以看出其和 普通方法的区别:1)不写返回值,但是有返回值,返回对象的内存地址。
2)方法名必须和类名一样。另外还有3)只在创建对象的时候调用。因此,可以用它来为对象的数据成员做初始化赋值。下面用java代码来说明:
 public class Police{

[code="java"]public Police(){
System.out.println("new ");//Police类的构造方法
}
Police p=new Police();//实例化一个对象p,此时调用Police类的无参构造方法,在屏幕上显示“new”

}[/code] 在java中,存在两个或几个方法的方法名相同,参数的个数,参数的类型不同,或者参数顺序不同的方法,叫做方法的重载。其特点是方法名相同,参数不同。其作用是实现做同一件事情的多种不同形式。格式如下所示:
class 类名称{
访问权限 返回值类型 方法名称(类型1 参数1){
方法主体
}
访问权限 返回值类型 相同方法名称(类型1 参数1,类型2 参数2){

方法主体
}
访问权限 返回值类型 相同方法名称(类型2 参数2,类型1 参数1){
方法主体
}

}
构造方法也同样可以重载,下面通过一段代码来说明:
public class Police{

public Police(){
System.out.println("第一个");
}
public Police(int a){
System.out.println("第二个");
}
Police p1=new Police();//调用了第一个构造方法,显示"第一个"
Police p2=new Police(1);//调用了第二个构造方法,显示“第二个”
}
最后引用传递,我想通过代码来说明:
public class Main{
public static void main(String [] args){
QLZ Q1=new QLZ();
Q1.name=("侵略者");//在堆内存中开辟一个新空间,新建一个对象,并把它的地址赋予Q1,以后用到Q1,其就会把地址传递过去
S1.PK(Q1);//引用传递,Q1把对象的地址传递过来
}
### 构造函数重载的用法和规则 在C++中,构造函数重载是一种常见的编程实践,允许类具有多个构造函数,这些构造函数可以接受不同数量或类型的参数。通过这种方式,开发者可以根据不同的需求初始化对象。 #### 1. 基本概念 构造函数重载是指在一个类中定义多个构造函数,它们的区别在于参数列表的不同。这使得可以通过多种方式创建类的对象[^1]。例如: ```cpp class Foo { public: Foo(); // 默认构造函数 Foo(int value); // 接受一个整数参数的构造函数 }; ``` 上述代码展示了两个构造函数:一个是默认构造函数 `Foo()`,另一个是带有单个整型参数的构造函数 `Foo(int value)`。 --- #### 2. 使用成员初始化列表调用其他构造函数 当一个构造函数需要调用同一个类中的另一个构造函数时,可以使用成员初始化列表实现这一点。这种技术被称为委托构造函数(delegating constructors)。它简化了代码并减少了重复逻辑。 以下是具体示例: ```cpp class Foo { private: int data; public: Foo() : Foo(0) {} // 调用了带参构造函数 Foo(int value) : data(value) {} }; ``` 在这个例子中,默认构造函数 `Foo()` 实际上调用了带参构造函数 `Foo(int value)` 并传递了一个默认值 `0` 给它。 --- #### 3. 构造函数重载的规则 尽管构造函数重载提供了灵活性,但也有一些重要的规则需要注意: - **唯一性**:每个构造函数必须有唯一的签名(即参数的数量或类型组合必须不同)。 - **隐式转换的风险**:如果某些构造函数被设计得过于通用,则可能导致意外的隐式类型转换。为了避免这种情况,可以使用关键字 `explicit` 将构造函数标记为显式的。 下面是一个关于 `explicit` 的示例: ```cpp class Bar { public: explicit Bar(int x) { /* 初始化 */ } }; void func(Bar b) {} int main() { Bar bar(5); // 显式调用构造函数 func(bar); // 下面这一行会报错,因为无法隐式转换 // func(5); } ``` 在此处,由于构造函数被声明为 `explicit`,因此不会发生从 `int` 到 `Bar` 类型的隐式转换。 --- #### 4. 特殊情况下的注意事项 除了基本规则外,在涉及继承关系的情况下还需要注意一些特殊行为。例如,派生类的构造函数并不会自动调用基类的任何构造函数;相反,必须显式指定要调用哪个基类构造函数[^5]。 ```cpp class Base { protected: int baseValue; public: Base() : baseValue(0) {} Base(int v) : baseValue(v) {} }; class Derived : public Base { private: int derivedValue; public: Derived() : Base(), derivedValue(0) {} // 调用Base() Derived(int v) : Base(v), derivedValue(v * 2) {} // 调用Base(int) }; ``` 这里可以看到,无论何时创建 `Derived` 对象,都必须明确告诉编译器如何初始化其基类部分。 --- #### 5. 总结 构造函数重载增强了类的设计能力,使我们能够以更灵活的方式实例化对象。然而,为了保持代码清晰性和可维护性,应该遵循良好的编码习惯,比如合理利用 `explicit` 关键字以及谨慎处理继承场景下基类与派生类之间的交互。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值