Java 中数据类型分为两大类:基本数据类型、引用数据类型。
基础数据类型在之前的 Java 基础已经讲过了,引用数据类型又分为两种:一种是 Java 为我们提供好的类,例如 String、Scanner、Random 等,在每一个类中又定义了一些属性、方法,我们直接拿来使用即可,除 此之外我们还可以自定义类,以便来解决 Java 为我们提供好的类不能满足需求的问题。
类的定义
修饰符 class 类名{
//属性(成员变量、类变量)
数据类型 属性名1;
数据类型 属性名2;
数据类型 属性名3;
....
//方法(行为、功能)
修饰符 返回值类型 方法名1(参数列表){
//方法体
}
修饰符 返回值类型 方法名2(参数列表){
//方法体
}
...
}
成员变量和局部变量的区别
1、定义的位置不同成员变量:
成员变量:定义在类中的方法之外,它是用来描述类或者该类类型的 对象的,因此成员变量是属于类或者对象。
局部变量:定义在类中的方法之中或者代码块之中的变量,我们称之为局部变量。
2、存储位置不同
成员变量:存储在堆内存中的对象中,因为成员变量是属于对象的。
局部变量:存储在栈内存中的方法对应的方法栈中的。
3、生命周期不同
成员变量:成员变量是属于对象,它是随着对象的创建而出现在堆内存中,同样的随着对象的销毁而销毁。
局部变量:随着方法的调用执行出现在方法对应方法栈中,同样的随着方法执行结束(弹栈)之后而被释放。
4、初始化不同
成员变量:它是随着对象的创建而出现在堆内存中,如果我们没有为成员变量显式的指定一个初始值,那么成员变量就会有一个默认的初始值,整型的初始值为 0,浮点型的初始值为 0.0,字符型的初始值为空字符,布尔类型的初始值为 false,引用数据类型的初始值为 null。
局部变量:必须手动的去声明一个初始值,否则这个变量就不能够使用。
方法的定义
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...){
//方法体
//如果返回值类型为 void,则不需要 return 语句,如果返回值为类型非 void,则需要return
//方法体执行完之后的结果,返回的结果必须与方法声明时的返回值类型一致
}
修饰符:方法的修饰符有很多,有进行权限限制的(public、default、protected、private),还有静态修饰符 static,方法使用了静态修饰符 static,则表示该方法属于类的,在实际调用执行的时候可以直接使用类名去调用。
返回值类型:用来限定方法调用执行的时候最终返回的结果的类型,如果方法没有一个具体的结果 返回,则把方法的返回值类型声明为 void。
方法名:给自定义的方法起一个名字,方便在方法定义完成之后进行调用,在起方法名的时候尽量 起得有意义,这样一来通过方法名我们就可以知道该方法大概的用途,并且方法名在起名的时候与 变量名类型都是小写开头并遵循驼峰命名法。
参数类型:用来限制方法在调用执行的时候实际传入的参数的数据类型。
参数名:参数名是任意的,它实际上是一个变量,不管参数名是什么,它都表示方法在调用执行的 过程中实际传入的参数。
return 关键字:用来结束方法并返回方法执行结束的结果,如果方法没有具体的返回值,则可以 把 return 语句省略。
方面名后面的圆括号中内容,整个称之为形参列表,它可以是 0 个、1 个、甚至多个参数,至于参数具体有几个就看方法定义声明时的实际需求。
方法调用过程
/**
* 求两个 int 类型的整数的和
*
* @param x 表示参与求和运算中的一个整数
* @param y 表示参与求和运算中的另一个整数
* @return
*/
public static int plus(int x,int y) {
return x + y;
}
// 在 main 方法中调用 plus 方法:
public static void main(String[] args) {
int sum = plus(123, 456);
System.out.println(sum);
}
方法定义类别
1、有返回值有参数;
/**
* 求两个 int 类型的整数的和
*
* @param x 表示参与求和运算中的一个整数
* @param y 表示参与求和运算中的另一个整数
* @return
*/
public static int plus(int x,int y) {
return x + y;
}
2、有返回值没有参数;
/**
* 随机出一个 [0,100) 之间的整数
* @return
*/
public static int randomInteger() {
Random random = new Random();
int n = random.nextInt(100); //[0,100)
return n;
}
3、没有返回值有参数;
/**
* 打印一个由 n 行 * 组成的直角三角形
* @param n
*/
public static void show(int n) {
for(int i = 0;i <= n;i++) {
for(int j = 0;j < i;j++) {
System.out.print("*");
}
System.out.println();
}
}
4、没有返回值没有参数;
/**
* 打印一个由 5 行 * 组成的直角三角形
*
* @param n
*/
public static void show() {
for(int i = 0;i <= 5;i++) {
for(int j = 0;j < i;j++) {
System.out.print("*");
}
System.out.println();
}
}
上面有两个名为 show 方法,在一个类中是允许出现同名的方法,但是同名的方法的参数列 表必须不同,这样的方称之为重载。
方法重载
在一个类中存在多个名称相同的方法,但是这些方法的参数列表不同,则这多个方法构成重载,换句话说同一个类中方法名相同参数列表不同的多个方法(参数列表不同值得的是数据类型不同、参数个数不同,跟参数的名称无关)。
比如下面这两个就是同一个方法:
public static int plus(int a,int b) {
return a + b;
}
public static int plus(int x,int y) {
return x + y;
}
Java 中一个类型相同的方法只跟方法名以及参数列表有关,跟方法的返回值类型是无关的。
比如下面这两个方法就是同一个方法,而在 Java 中一个类中是不允许出现相同的方法,因此编译出错;
public static double plus(int a,int b) {
return a + b;
}
public static int plus(int x,int y) {
return x + y;
}
可变长度参数列表
public static int plus(int x,int y) {
return x + y;
}
这样plus 方法是求两个数的和,但是现在要求不确定的多个数的和,就可以使用可变长度参数列表。参数传递
Java 中,可以使用 "参数类型..." 方式表示多个指定类型的参数,在实际调用执行方法的时候,这多 个指定类型的参数会被封装成指定类型的数组去使用。
/**
* 求多个 int 类型的整数的和
*
* @param args
* @return
*/
public static int plus(int... args) {
int sum = 0;
for(int i = 0;i < args.length;i++) {
sum += args[i];
}
return sum;
}
参数传递
定义方法的时候,会有参数列表,参数列表中的参数都称之为形式参数,简称形参。当方法定义完成之后,我们在实际调用使用的时候,需要把实际的参数传递给定义的时候参数列表中对应的形参,此时方法在调用执行的时候,形参的值就为实际传递进来对应的实际参数值,整个传递过程我们称之为参数传递。
(1)当调用方法的时候,传入具体的参数值的数据类型为基本类型以及 String 类型,形式参数的改变对实际参数并不会参数任何影响。
(2)当调用方法的时候,传入具体的参数值的数据类型为引用类型(String 类型除外),即对象,形式参数的改变会对对象的内部发生影响,即对象在堆内存中所占的内存内部的内容产生了影响,但是对于对象本身而言还是原来的对象,即在堆内存中还是那块内存。
示例1:
public static void main(String[] args) {
int x = 10;
int y = 5;
change(x, y);
System.out.println("变量 x 的值为:" + x);
System.out.println("变量 y 的值为:" + y);
}
public static void change(int x,int y) {
x = 100;
y = 50;
}
输出结果:
变量 x 的值为:10
变量 y 的值为:5
示例2:
public static void main(String[] args) {
int[] array = {1,24,46,78,79};
change(array);
System.out.println(Arrays.toString(array));
}
public static void change(int[] array) {
for(int i = 0;i < array.length;i++) {
array[i] = 99;
}
}
输出结果:
[99, 99, 99, 99, 99]