Java面向对象编程深入解析
立即解锁
发布时间: 2025-08-19 00:09:16 阅读量: 2 订阅数: 7 


Java 17编程实战与核心概念精讲
# Java面向对象编程深入解析
## 1. 方法基础
### 1.1 方法的定义与结构
在Java中,语句通常组织为方法,其基本结构如下:
```java
<return type> <method name>(<list of parameter types>){
<method body that is a sequence of statements>
}
```
方法包含名称、输入参数(可以没有)、位于`{}`内的方法体以及返回类型(若不返回值则使用`void`关键字)。方法名和参数类型列表共同构成方法签名,输入参数的数量称为元数。
### 1.2 方法签名的判断
两个方法若具有相同的名称、元数和输入参数类型序列,则它们具有相同的签名。例如:
```java
double doSomething(String s, int i){
//some code goes here
}
double doSomething(String i, int s){
//some code other code goes here
}
```
这两个方法具有相同的签名,尽管方法内部代码可能不同。而下面两个方法签名不同:
```java
double doSomething(String s, int i){
//some code goes here
}
double doSomething(int s, String i){
//some code other code goes here
}
```
仅仅参数顺序的改变就会使签名不同,即使方法名相同。
### 1.3 Varargs参数
Varargs(可变参数)是一种特殊的参数类型,通过在类型后加三个点声明。在介绍Varargs之前,先简单了解一下Java中的数组,数组是一种存储相同类型元素的数据结构,元素通过数字索引引用。
下面是使用Varargs声明方法参数的示例:
```java
String someMethod(String s, int i, double... arr){
//statements that compose method body
}
```
当调用`someMethod`方法时,Java编译器从左到右匹配参数,遇到最后一个Varargs参数时,会将剩余参数创建为一个数组并传递给方法。示例代码如下:
```java
public static void main(String... args){
someMethod("str", 42, 10, 17.23, 4);
}
private static String someMethod(
String s, int i, double... arr){
System.out.println(arr[0] + ", " + arr[1] + ", " + arr[2]);
//prints: 10.0, 17.23, 4.0
return s;
}
```
Varargs参数可作为方法的最后一个或唯一参数,这也是有时会看到`main`方法这样声明的原因。
## 2. 构造函数
### 2.1 构造函数的作用
当创建对象时,JVM会使用构造函数来初始化对象状态,为所有声明的属性赋值。若类中未声明构造函数,JVM会为属性赋予默认值。对于基本类型,整数类型默认值为0,浮点类型为0.0,布尔类型为false;对于其他Java引用类型,默认值为`null`。
### 2.2 显式声明构造函数
可以根据需要显式声明任意数量的构造函数,每个构造函数接受不同的参数集来设置初始状态。示例如下:
```java
class SomeClass {
private int prop1;
private String prop2;
public SomeClass(int prop1){
this.prop1 = prop1;
}
public SomeClass(String prop2){
this.prop2 = prop2;
}
public SomeClass(int prop1, String prop2){
this.prop1 = prop1;
this.prop2 = prop2;
}
// methods follow
}
```
若某个属性未通过构造函数设置,会自动赋予相应类型的默认值。
### 2.3 父子类构造函数调用
当多个类存在继承关系时,先创建父对象。若父对象的属性需要非默认初始值,子构造函数的第一行必须使用`super`关键字调用父构造函数。示例如下:
```java
class TheParentClass {
private int prop;
public TheParentClass(int prop){
this.prop = prop;
}
// methods follow
}
class TheChildClass extends TheParentClass{
private int x;
private String prop;
private String anotherProp = "abc";
public TheChildClass(String prop){
super(42);
this.prop = prop;
}
public TheChildClass(int arg1, String arg2){
super(arg1);
this.prop = arg2;
}
// methods follow
}
```
在上述代码中,`TheChildClass`添加了两个构造函数,一个总是将42传递给`TheParentClass`的构造函数,另一个接受两个参数。注意,`x`属性声明但未显式初始化,创建`TheChildClass`对象时会设置为`int`类型的默认值0;`anotherProp`属性显式初始化为`"abc"`,否则会初始化为`null`。
### 2.4 无需显式定义构造函数的情况
逻辑上,有三种情况不需要在类中显式定义构造函数:
- 当对象及其父类都没有需要初始化的属性时;
- 当每个属性在类型声明时就进行了初始化(例如`int x = 42`);
- 当属性的默认初始化值足够时。
不过,即使满足上述三个条件,也可能会实现构造函数,例如需要执行一些初始化外部资源(如文件或数据库)的语句。
### 2.5 显式构造函数与默认构造函数
一旦添加了显式构造函数,默认构造函数将不再提供。例如以下代码会产生错误:
```java
class TheParentClass {
private int prop;
public TheParentClass(int prop){
this.prop = prop;
}
// methods follow
}
class TheChildClass extends TheParentClass{
private String prop;
public TheChildClass(String prop){
//super(42); //No call to the parent's constructor
this.prop = prop;
}
// methods follow
}
```
为避免错误,可以在`TheParentClass`中添加无参数构造函数,或者在子构造函数的第一行调用父类的显式构造函数。以下代码不会产生错误:
```java
class TheParentClass {
private int prop;
public TheParentClass() {}
public TheParentClass(int prop){
this.prop = prop;
}
// methods follow
}
class TheChildClass extends TheParentClass{
private String prop;
public TheChildClass(String prop){
this.prop = prop;
}
// methods follow
}
```
构造函数虽然看起来像方法,但它不是方法,也不是类的成员。构造函数没有返回类型,且名称总是与类名相同,其唯一目的是在创建类的新实例时被调用。
## 3
0
0
复制全文
相关推荐










