You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
4.3 KiB
Markdown

3 years ago
Java的函数和 C 类似但因为Java是面向对象的语言所以又有很多扩展的地方我们这里主要对其特殊的地方进行讲解。
## 静态函数与非静态函数
到目前为止,我们学习的大多是静态函数。什么是静态函数?简单说来,静态函数是不依附对象就可以直接运行的函数。这个怎么解释?要了解静态与非静态函数的区别,首先需要知道什么是对象。前面说过,类是抽象描述的,如同类型定义;对象是类的一个真实变量(分配了具体的内存)。这种关系如果我们第一章的结构体指针类型和一个分配了存储空间的结构体指针变量。
### 如何计算字符串的长度
接下来看看C的函数的语义。函数是具备高度抽象的计算功能需要传入参数后返回或者不返回结果对数据进行修改。例如C语言如果需要确定字符串的长度这个函数的原型签名是这样的
```C {.line-numbers}
int strlen(const char *str)
```
注意C是非面向对象的因此它需要知道需要计算哪个字符串的长度。
接下来我们看看Java字符串长度的函数
```java {.line-numbers}
String s = "Hello world!";
int size = s.length();
```
看到区别了吗Java计算字符串长度的意思是计算自己本身字符串的长度C是的含义是计算谁的字符串长度。这个就是最根本的区别。
对象是相关数据与在相关数据上操作函数的集合。
显然s这个对象String类型的实例本身含有数据字符串内容以及相关的操作函数例如 length 这个函数。因此length()并不需要传入字符串的参数因为length()在 s 这个对象上执行s本身包含数据。
一般说来,需要在对象上执行的函数叫做非静态函数;而不需要对象,直接可以运行的函数叫做静态函数。其实,静态变量也是一样的,后面会做解释。
在前面几章中我们大多使用静态函数例如对基本类型小写开头的类型非类类型非包装类型操作的函数大多是静态函数。想一想为什么因为基本类型尽量做到与C兼容不是对象需要静态函数来对基本类型进行操作。后面会学到基本类型的包装类型warp类型本生就是对象因此可以直接在对象上进行操作。
想一想,前面学过那些静态函数?
前面章节也有例外,这些大写的类型都是类,一般都会实例化一个对象进行使用,例如:
1. String 类型
2. Scanner 类型
### Java与C语言像吗
我们看看一个例子:
```java {.line-numbers}
public class Main {
static int size;
public static void main(String[] args) {
String s = "Hello world!";
size = s.length();
System.out.printf("String:'%s', size is %d.", s, size);
}
}
```
上面这个例子,如果我们把类定义去掉后变成什么样子?
```java
static int size;
public static void main(String[] args) {
String s = "Hello world!";
size = s.length();
System.out.printf("String:'%s', size is %d.", s, size);
}
```
看看上面的例子结构是不是非常像C语言
思考一个问题Java有全局变量吗如果没有如何实现全局变量
如何调用一个静态的常量或者是变量?包是如何组织的?
其实Java没有C那样的全局变量。因为Java所有的代码必须在一个类定义中一个类在一个包中。这样调用一个变量必须是静态的可以使用 xxx.yyy.Zzz.var 的方式进行调用。其中xxx.yyy 是包定义Zzz是类名var是该类中的一个静态变量。同理静态函数的调用也可以使用这种方式。这种方式在Java中叫做命名空间name space有什么好处优势是所有的函数、变量、常量等都在一个空间中不像C语言是全局的这样即使是同名的变量、常量、函数只要不再同一个空间中也不可能在同一个空间中那么就是合法的。通过空间的方式相当于多了一个限定不必给变量、常量、函数取很长的名字来进行区分。反观C语言你们会看看很长的命名因为都在全局中需要保证命名的唯一性。