在C语言基础上学Java【Java】【二】
众所周知,Java是C风格的语言,对于学过C语言的人学Java可以快速适应。
废话不多说,直接边看代码边学。
数组
static void array(){
//完整写法,int []a1=new int[]{1,2,3},可以看到,数组的静态初始化也是通过new关键字声明的,因此内存空间也会在堆内存上
int []a1={1,2,3};//数组的静态初始化,也可以这样int a1[]={1,2,3},但不推荐
int []a2=new int[5];//数组的动态初始化,所有数组的内存都是在堆内存上分配的
//数组的动态初始化会自动初始化,数值类型的会被初始为0,布尔类型的会被初始为false,引用类型的会被初始为null
int [][]a3={{1,2,3},{4,5,6}};//
int [][]a4=new int[5][5];//二维数组的动态初始化,可以不写第二维
//注意,二维数组可以被认为是一维数组的数组,不同“行”的数组在堆中不同的地方
//注意,像a1,a3[0]等这些都是存放内存地址的
System.out.println(a1);//结果会是这样的[I@……,“[”表示数组,“I”表示类型是int型,“@”为分隔符,其后为内存地址
//注意,数组会在适当的时候被JVM回收其占用的内存,不需要手动释放数组内存
}
方法(函数)
你可以将Java中的方法理解为C语言中的函数。
void类型的方法
void method1(){
System.out.println("Hello World");
return ;
}
int类型的方法
int method2(int a,int b){
return a+b;
}
引用类型的方法
int []method3(){
int []temp={1,2,3};
return temp;
}
static关键字
在C语言中,static关键字通常用来修饰变量,用来保证变量的生命周期够长;而在Java中,static关键字通常用来修饰方法,用static修饰的方法被称为静态方法,不用的称为实例方法,静态方法中不能直接调用实例方法,但实例方法可以直接调用静态方法。
-
静态方法:属于类,无需实例,只能直接访问静态成员。
-
实例方法:属于对象,需通过实例调用,可访问静态和实例成员。
为什么不允许静态方法直接调用非静态方法?
-
非静态方法依赖对象状态
非静态方法可能操作对象的成员变量(如this.value
)。如果允许静态方法直接调用非静态方法,相当于在没有对象实例的情况下,尝试操作一个不存在的对象的状态,这会导致逻辑混乱甚至内存错误。 -
Java 通过语法规则强制禁止这种调用,目的是:
-
保证对象先于方法存在:确保非静态方法被调用时,其依赖的对象实例已正确初始化。
-
明确职责边界:静态方法应专注于与类相关的操作(如工具方法),而非静态方法专注于对象的行为和状态。
什么是类,什么是对象?
这里先简单的说一下,后续将详细介绍。
类是「模板」,对象是「根据模板造出的具体东西」,类只定义规则,不实际存在,对象是具体存在的,可以实际操作的东西。
class a2{
static void method(){//静态方法
new a2().method1();//a2为类名
}
void method1(){//实例方法
System.out.println("Hello World");
}
int method2(int a,int b){
a2.method();//可以写成method();
method1();
return a+b;
}
}
public关键字
在C语言中,可以通过将函数所在文件作为头文件在其他文件中调用;在Java中,可以通过加上修饰字public方便地在不同包的其他文件中使用(可以将同一个包的所有Java文件看成是一个特殊的文件被拆成不同文件,但实际并不是,这只是个比喻)。注意,static对方法的修饰会导致不同的方法调用方式。
作用:控制方法的访问权限
-
加
public
:方法对所有类可见(包括其他包中的类)。 -
不加:方法默认是包级可见(仅在同一个包内的类中可访问)。
public class MyClass {
public void publicMethod() {} // 任何类均可调用
void packagePrivateMethod() {} // 仅同包类可调用
}
方法的重载
Java 允许方法重载,即在同一个类中,可以定义多个名称相同但参数类型或参数个数不同的方法。
例一:
int method1(int a,int b){
return a+b;
}
int method1(int a,int b,int c){
return a+b+c;
}
例二
int method2(int a,int b){
return a+b;
}
int method2(int a,long b){
return (int)(a+b);
}
例三
int method3(long a,int b){
return (int)(a+b);
}
int method3(int a,long b){
return (int)(a+b);
}
错误示例:
例一
int method1(int a,int b){
return a+b;
}//仅返回类型不同,无法重载
double method1(int a,int b){
return a+b;
}
例二
int method2(int a,int b){
return (a+b);
}//参数顺序不同但类型相同,视为同一方法签名
int method2(int b,int a){
return a+b;
}