10. 方法的参数传递

10.1 基本类型参数传递

  • 测试代码:
public class ArgsDemo01 {
     public static void main(String[] args) {
         int number = 100;
         System.out.println("调用change方法前:" + number);
         change(number);
         System.out.println("调用change方法后:" + number);
     }
 
     public static void change(int number) {
         number = 200;
     }
 }
  • 结论
  • 基本数据类型的参数,形式参数的改变,不影响实际参数
  • 结论依据:
  • 每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失

10.2 引用类型参数传递

  • 测试代码:
public class ArgsDemo02 {
     public static void main(String[] args) {
         int[] arr = {10, 20, 30};
         System.out.println("调用change方法前:" + arr[1]);
         change(arr);
         System.out.println("调用change方法后:" + arr[1]);
     }
 
     public static void change(int[] arr) {
         arr[1] = 200;
     }
 }
  • 结论
  • 对于引用类型的参数,形式参数的改变,影响实际参数的值
  • 结论依据:
  • 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果

10.3 区别

  • 基本类型和引用类型的参数传递都是值传递
  • 基本类型的参数传递的是数据值
  • 引用类型的参数传递的是地址值

11. 方法重载

  • 方法重载概念
    方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
  • 多个方法在同一个类中
  • 多个方法具有相同的方法名
  • 多个方法的参数不相同,类型不同或者数量不同

同一类中,多个方法名称相同,形参列表不同

形参的个数、类型、顺序不同,不关心形参名称

  • 注意:
  • 重载仅对应方法的定义,与方法的调用无关,调用
  • 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
  • 正确范例:
public class MethodDemo {
     public static void fn(int a) {
         //方法体
     }
     public static int fn(double a) {
         //方法体
     }
 }
 
 public class MethodDemo {
     public static float fn(int a) {
         //方法体
     }
     public static int fn(int a , int b) {
         //方法体
     }
 }
  • 错误范例:
public class MethodDemo {
     public static void fn(int a) {
         //方法体
     }
     public static int fn(int a) {   /*错误原因:重载与返回值无关*/
         //方法体
     }
 }
 
 public class MethodDemo01 {
     public static void fn(int a) {
         //方法体
     }
 } 
 public class MethodDemo02 {
     public static int fn(double a) { /*错误原因:这是两个类的两个fn方法*/
         //方法体
     }
 }

方法重载案例

  • 需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)
  • 思路:
  • ①定义比较两个数字的是否相同的方法compare()方法,参数选择两个int型参数
  • ②定义对应的重载方法,变更对应的参数类型,参数变更为两个long型参数
  • ③定义所有的重载方法,两个byte类型与两个short类型参数
  • ④完成方法的调用,测试运行结果
  • 代码:
public class MethodTest {
     public static void main(String[] args) {
         //调用方法
         System.out.println(compare(10, 20));
         System.out.println(compare((byte) 10, (byte) 20));
         System.out.println(compare((short) 10, (short) 20));
         System.out.println(compare(10L, 20L));
     }
 
     //int
     public static boolean compare(int a, int b) {
         System.out.println("int");
         return a == b;
     }
 
     //byte
     public static boolean compare(byte a, byte b) {
         System.out.println("byte");
         return a == b;
     }
 
     //short
     public static boolean compare(short a, short b) {
         System.out.println("short");
         return a == b;
     }
 
     //long
     public static boolean compare(long a, long b) {
         System.out.println("long");
         return a == b;
     }
 
 }

12. 面向对象

12.1类和对象

  • 三个步骤
  • 1.创建类,设计类的成员
  • 创建类的对象
  • 通过“对象.属性"或"对象.方法"调用对象的结构

类和对象的

  • 类是显示中一类具有相同属性和行为的事物的抽象
  • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
  • 对象是能看得见摸得着的真实存在的实体
  • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

类的定义

类由属性和行为两部分组成

  • 属性:在类中通过成员变量来体现(类中方法外的变量)
  • 行为:通过成员方法来体现(前面的方法相比去掉了static关键字)

对象的使用

  • 创建对象的格式
  • 类名 对象名 = new 类名();
  • 调用成员的格式
  • 对象.成员变量
  • 对象。成员方法()

12.2 成员变量和局部变量的区别

  • 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上)
  • 内存中位置不同:成员变量(堆内存)局部变量(栈内存)
  • 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,随着方法的调用完毕而消失)
  • 初始化值不同:成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用)

12.3 构造方法概述

构造方法是一种特殊的方法,,与前面的方法类似

  • 作用:创建对象 Student stu = new Student();
  • 格式:
    public class 类名{
    修饰符 类名( 参数 ) {
    }
    }
  • 功能:主要是完成对象数据的初始化
  • 示例代码:
class Student {
     private String name;
     private int age;
 
     //构造方法
     public Student() {
         System.out.println("无参构造方法");
     }
 
     public void show() {
         System.out.println(name + "," + age);
     }
 }
 /*
     测试类
  */
 public class StudentDemo {
     public static void main(String[] args) {
         //创建对象
         Student s = new Student();
         s.show();
     }
 }

无参数和有参数构造器

  • 无参数构造器

类定义之后,系统将给出一个默认的无参数构造方法

  • 有参数构造器

如果定义了有参数构造方法,系统将不再提供默认的无参数构造方法,需要手动添加

构造方法的注意事项

  • 构造方法的创建

如果没有定义构造方法,系统将给出一个默认的无参数构造方法 如果定义了构造方法,系统将不再提供默认的构造方法

  • 构造方法的重载

如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法

  • 推荐的使用方式

无论是否使用,都手工书写无参数构造方法

  • 重要功能!

可以使用带参构造,为成员变量进行初始化

  • 示例代码
/*
     学生类
  */
 class Student {
     private String name;
     private int age;
 
     public Student() {}
 
     public Student(String name) {
         this.name = name;
     }
 
     public Student(int age) {
         this.age = age;
     }
 
     public Student(String name,int age) {
         this.name = name;
         this.age = age;
     }
 
     public void show() {
         System.out.println(name + "," + age);
     }
 }
 /*
     测试类
  */
 public class StudentDemo {
     public static void main(String[] args) {
         //创建对象
         Student s1 = new Student();
         s1.show();
 
         //public Student(String name)
         Student s2 = new Student("林青霞");
         s2.show();
 
         //public Student(int age)
         Student s3 = new Student(30);
         s3.show();
 
         //public Student(String name,int age)
         Student s4 = new Student("林青霞",30);
         s4.show();
     }
 }

标准类制作

  • 需求:定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。
  • 示例代码:
class Student {
     //成员变量
     private String name;
     private int age;
 
     //构造方法
     public Student() {
     }
 
     public Student(String name, int age) {
         this.name = name;
         this.age = age;
     }
 
     //成员方法
     public void setName(String name) {
         this.name = name;
     }
 
     public String getName() {
         return name;
     }
 
     public void setAge(int age) {
         this.age = age;
     }
 
     public int getAge() {
         return age;
     }
 
     public void show() {
         System.out.println(name + "," + age);
     }
 }
 /*
     创建对象并为其成员变量赋值的两种方式
         1:无参构造方法创建对象后使用setXxx()赋值
         2:使用带参构造方法直接创建带有属性值的对象
 */
 public class StudentDemo {
     public static void main(String[] args) {
         //无参构造方法创建对象后使用setXxx()赋值
         Student s1 = new Student();
         s1.setName("林青霞");
         s1.setAge(30);
         s1.show();
 
         //使用带参构造方法直接创建带有属性值的对象
         Student s2 = new Student("林青霞",30);
         s2.show();
     }
 }

12.4 封装

封装思想

  1. 封装概述 是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
  2. 封装原则 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法
  3. 封装好处 通过方法来控制成员变量的操作,提高了代码的安全性 把代码用方法进行封装,提高了代码的复用性

private关键字

private是一个修饰符,可以用来修饰成员(成员变量,成员方法)

  • 被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

private的使用

  • 需求:定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出  林青霞,30
  • 示例代码:
/*
     学生类
  */
 class Student {
     //成员变量
     private String name;
     private int age;
 
     //get/set方法
     public void setName(String n) {
         name = n;
     }
 
     public String getName() {
         return name;
     }
 
     public void setAge(int a) {
         age = a;
     }
 
     public int getAge() {
         return age;
     }
 
     public void show() {
         System.out.println(name + "," + age);
     }
 }
 /*
     学生测试类
  */
 public class StudentDemo {
     public static void main(String[] args) {
         //创建对象
         Student s = new Student();
 
         //使用set方法给成员变量赋值
         s.setName("林青霞");
         s.setAge(30);
 
         s.show();
 
         //使用get方法获取成员变量的值
         System.out.println(s.getName() + "---" + s.getAge());
         System.out.println(s.getName() + "," + s.getAge());
 
     }
 }

this关键字

  • this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)

指向的是当前对象的成员变量和方法