java入门(三)
值传递和引用传递
值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
第一个例子:
public class Hello {
public static void main(String[] args) {
Hello hello = new Hello();
// 基本数据类型
int i = 10;
hello.pass(i);
System.out.println("i = " + i);
}
public void pass(int pas) {
pas = 20;
System.out.println("pas = " + pas);
}
}
运行结果为:pas=20 i=10
第二个例子:
public class Hello {
public static void main(String[] args) {
Hello hello = new Hello();
// String类
String s = "hello";
hello.pass(s);
System.out.println("s = " + s);
}
public void pass(String str) {
str = "world";
System.out.println("str = "+ str);
}
}
运行结果:str=world s=hello
通过运行结果可以看出值也是发生了变化的,但是调用函数对String类赋值的时候【str = “world”;】相当于是【str = new String(“world”);】;我这里理解是变量str重新指向了一个新的对象的地址。
第三个例子:
public class Hello {
public static void main(String[] args) {
Hello hello = new Hello();
// 对象
User user = new User();
user.setName("wang");
hello.pass(user);
System.out.println("main:"+user.getName());
}
public void pass(User user) {
user.setName("java");
System.out.println("The name is :" + user.getName());
}
}
运行结果:The name is:java main:java
看到这个例子的时候,便是我最大疑问的时候,当时我便觉得在Java中基本数据类型是值传递,对象数据类型是引用传递,而String看做一个特殊的类。在看下一个例子;
第四个例子:
public class Hello {
public static void main(String[] args) {
Hello hello = new Hello();
User user2 = new User();
user2.setName("li");
hello.pass2(user2);
System.out.println("main:"+user2.getName());
}
public void pass2(User user) {
user = new User();
user.setName("java new");
System.out.println("The name is :" + user.getName());
}
}
运行结果:The name is:java main:li
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDZdUNsS-1634219738197)(C:\Users\yx\AppData\Roaming\Typora\typora-user-images\image-20210910213022766.png)]
面向对象
面向对象编程的本质就是:以类的方式组织代码,以对象的组织封装数据。
三大特性:封装、继承、多态。
类与对象
类是抽象的,对象是类的实例化。实例化方法如下:
类名 对象名 = new 类名();
使用new关键字创建对象的时候,除了分配内存空间之外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。
属性和方法
属性,字段,成员变量都是一个东西,可以是基本数据类型也可以是引用类型。
方法就相当于函数。关于方法的笔记在Java入门(二)。
构造器
类中的构造器也成为构造方法,是在进行创建对象的时候必须要调用的,就相当于类的初始化。具有以下两个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
修饰符 方法名(形参列表){ //也可以没有形参
方法体;
}
实例化
public Person(String pName, int pAge){
name = pName;
age = pAge;
}
注:
- 一个类可以定义多个构造器,即构造器的重载。
- 构造器是完成对象的初始化,并不是构建对象。(在构建完对象后自动调用)
- 类生成时,系统自动给类一个默认无参构造器。当定义有参构造器时,会覆盖原有无参构造器,默认无参构造器无法在使用。如果需要,需手动再定义一遍。
this关键字
相当于python中的self,用于指向当前类的属性,方法和构造器,方便和局部变量进行区分。
this.属性名;
this.方法名(形参列表);
构造器语法:this(参数列表);
注:
- 利用this访问构造器,只能在构造器中使用,并且this必须是第一条语句。
- this实例化后指向当前对象的地址。
- this只能在类内部使用。
区分。
this.属性名;
this.方法名(形参列表);
构造器语法:this(参数列表);
注:
- 利用this访问构造器,只能在构造器中使用,并且this必须是第一条语句。
- this实例化后指向当前对象的地址。
- this只能在类内部使用。