目录
一. 值传递和引用传递
1. 值传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数.
public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1:" + num1 + "num2:" + num2); } // 值传递 public static void swap(int a, int b) { System.out.println("进入swap的a:" + a + "b:" + b); a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("结束的时候swap的a" + a + "b:" + b); }
2. 引用传递
引用传递是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
示例1:
public static void main(String[] args) { // 测试引用传递 int[] ns = { 1, 2, 3, 4 }; System.out.println("main开始前" + Arrays.toString(ns)); swap(ns); System.out.println("main结束" + Arrays.toString(ns)); } public static void swap(int[] ns1) { System.out.println("数组里的内容" + ns1); System.out.println("数组里的值" + Arrays.toString(ns1)); if (ns1.length >= 2) { ns1[0] = ns1[0] ^ ns1[ns1.length - 1]; ns1[ns1.length - 1] = ns1[0] ^ ns1[ns1.length - 1]; ns1[0] = ns1[0] ^ ns1[ns1.length - 1]; } System.out.println("操作后的数组内容" + Arrays.toString(ns1)); }
示例2:
public static void main(String[] args) { int[] ns1 = { 1, 2, 3, 4 }; int[] ns2 = { 22, 33 }; swap(ns1, ns2); System.out.println(Arrays.toString(ns1)); System.out.println(Arrays.toString(ns2)); } public static void swap(int[] ns1, int[] ns2) { int[] temp = ns1; ns1 = ns2; ns2 = temp; System.out.println(Arrays.toString(ns1)); System.out.println(Arrays.toString(ns2)); }
二. 面向对象思想
●什么是面向过程,什么是面向对象
●面向过程:亲力亲为
●面向对象:找人帮忙
三. 类和对象
●类:是对某一类事物的统称,比如举例人
●对象:是这一类事物中具体的个体。
类的基本组成部分:
属性:对类的静态描述(成员变量)
行为:这个类能干什么(方法)
类和对象的关系
●类是抽象的
●对象是具体的
总结:类是对象的抽象,对象是类的具体。
1. 类
语法规则:
修饰符 class 类名{ field;成员属性/全局变量 method;方法 } //修饰符:public //class: 修饰类的关键字 //类名:标识符,大驼峰命名法
成员属性:修饰符 数据类型 变量名; 修饰符 ---public公共的,privated私有的 数据类型---任意数据类型均可 变量名---见名知意
2. 对象
对象的创建:
●导包:import 包名.类名(同包下的类不用导包,java.lang包下的类不用导包)
●位置:放在类的上面,package的下面。
语法:
import 包名.类名
[注]:
●要使用的类和当前的类在同一个包下面,可以省略导包。
●使用java.lang包下的类,可以省略导包string,System
类名 对象名 = new 类名()
●对象名:标识符,小驼峰 和变量名命名一致
2.1 使用
操作成员变量:
调用属性: 赋值:对象名.属性名 = 值 取值:数据类型 变量名 = 对象名.属性名
●数据类型和成员变量名一致即可
●成员变量有默认值,基本数据类型和默认值一样。public class Person { // 属性 public String name; public int age; }
Person p1 = new Person(); p1.name = "zkt"; p1.age = 20;
●操作成员变量的时候,有可能会出现非法赋值;
●可以不让外部直接访问成员变量,将成员变量私有化(private)
提供getXXX()获取成员变量,方法有返回值
提供setXXX(数据类型 参数)给成员变量赋值,有参数
//有返回值,取值 public int getAge() { return age; } //有参数,赋值 //局部变量和全局变量发生重名的时候,优先使用局部变量 //成员变量前面加this关键字--强调当前的变量是成员变量 public void setAge(int age) { if (age < 0 || age > 140) { System.out.println("输入年龄有误"); } else { this.age = age; }
2.2 成员变量和局部变量区别
区别 成员变量 局部变量 类中位置不同 类内,方法外 方法中 初始化值不同 有默认初始化值,同数组一样 没有默认初始化值,使用之前必须完成赋值 内存位置不同 堆内存 栈内存 生命周期不同 在堆的内部,随着对象的产生而产生,随着对象被垃圾回收机制回收而消亡
随着方法的产生而创建,栈内,方法出栈,局部变量消亡。生命周期较短
作用域 类 成员方法中
2.3 操作成员方法
调用成员方法: 对象名.方法名(参数)---无返回的值方法调用 数据类型 变量名 = 对象名.方法名(参数)---有返回的值方法调用
public class Person { // 属性 public String name; //操作成员变量的时候,有可能会出现非法赋值; //可以不让外部直接访问成员变量,将成员变量私有化(private) //提供getXXX()获取成员变量,方法有返回值 //提供setXXX(数据类型 参数)给成员变量赋值,有参数 private int age; // 方法 public void study(String name) { System.out.println(name + "喜欢学习"); } public String eat(String sth) { return name + "中午要吃" + sth; } //有返回值,取值 public int getAge() { return age; } //有参数,赋值 //局部变量和全局变量发生重名的时候,优先使用局部变量 //成员变量前面加this关键字--强调当前的变量是成员变量 public void setAge(int age) { if (age < 0 || age > 140) { System.out.println("输入年龄有误"); } else { this.age = age; } } }
public class Demo02 { public static void main(String[] args) { Person p1 = new Person(); p1.name = "zkt"; System.out.println(p1.name); p1.study(); String str1 = p1.eat("红烧肉"); System.out.println(str1); } }
2.4 this关键字(初识)
当局部变量和成员变量重名时,Java一般选择就近原则,优先使用局部变量。非要使用成员变量,就需要使用this关键字进行区分。
class Student { int num = 10; public void show(){ int num = 20; System.out.println(num); // 20 局部变量 System.out.println(this.num); // 10 成员变量 } }
this含义: 当前对象的引用,谁调用谁就是this
用法:
this.字段 this.方法名() this() -- 调用构造函数 放在代码第一行