静态和非静态
//Hello 类
public class Hello {
//main 方法
public static void main(String[] args) { //修饰符,可选;返回值类型,与return一致;方法名,见名知意,驼峰原则;参数列表,实参和形参要保持一致的类型
a(); //静态方法本类可以直接调用,其他类通过类名.方法名()调用
Hello hello = new Hello();
hello.b(); //非静态方法,无论是本类调用还是其他类调用,都要先实例化
}
/* 回顾方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值;
}
*/
//静态方法,和类一起加载
public static void a() {
System.out.println("调用其他类的静态方法,可以直接通过类名.方法名()调用!");
//Hello.t();
b(); //静态方法不能调用非静态方法,因为静态方法和类一起加载的时候,非静态方法还没有被实例化
}
//非静态方法,只有被实例化了才会被加载
public void b(){
System.out.println("调用非静态方法,必须先实例化类,也就是new对象,再通过对象调用!");
//对象类型 对象名 = 对象值
//Hello hello = new Hello();
//hello.f();
a(); //非静态方法可以调用静态方法
}
public static void c(){
System.out.println();
a(); //静态方法之间可以相互调用
}
}
值传递和引用传递
public class Hello {
public static void main(String[] args) {
int a = 1;
int[] b = {0};
change(a);
System.out.println(a); //1,值传递不会改变原有的变量
Person person = new Person();
System.out.println(person.name); //null,属性默认值为null
change1(person);
System.out.println(person.name); //ty,引用传递会改变原来的属性值
change2(b);
System.out.println(b[0]); //1,数组也属于引用类型,也会改变原数值
}
public static void change(int a){
//a只是将数值复制过来,不影响原变量
a = 10;
}
public static void change1(Person person){
//person是一个对象,其指向--->Person person = new Person();这是可以改变属性的。涉及到对象和内存,见后
person.name = "ty";
}
public static void change2(int[] a){
a[0] = 1;
}
}
//新建一个类
class Person{
String name;
}
拓展:值传递(Java)和引用传递
对象和内存分析
- 当定义一个类以后,首先会在方法区生成相关的信息,包含类名,方法名和属性等
- 由于main()方法是静态方法,和类一起加载,被放入栈中
- 当new创建对象以后,会根据类的模板,在堆中初始化对象的相关属性和方法,然后在栈中保存对象的引用变量名。对象是通过引用来操作的:栈——>堆
- 可以看出,栈中保留的只是引用变量名,因此引用类型(数组、类、接口)被传参时,其指向的始终是堆中的数据,因此会被修改
Java面向对象01:回顾方法的使用