六, 面向对象的思想(二)

六, 面向对象的思想(二)

方法的重载

java 中允许同一个类中,多个同名方法的存在,但要求 形参列

示例:

public static void main(String[] args) {
   // System.out.println(100);
   // System.out.println("hello,world");
   // System.out.println('h');
   // System.out.println(1.1);
   // System.out.println(true);
   //
MyCalculator mc = new MyCalculator();
   System.out.println(mc.calculate(1, 2));
   System.out.println(mc.calculate(1.1, 2));
   System.out.println(mc.calculate(1, 2.1));
}
}
class MyCalculator {
   //下面的四个 calculate 方法构成了重载
   //两个整数的和
   public int calculate(int n1, int n2) {
  System.out.println("calculate(int n1, int n2) 被调return n1 + n2;
}
   //没有构成方法重载, 仍然是错误的,因为是方法的重复定义
   // public void calculate(int n1, int n2) {
       // System.out.println("calculate(int n1, int n2) 被调用");
       // int res = n1 + n2;
   // }
   //看看下面是否构成重载, 没有构成,而是方法的重复定义,就错了
   // public int calculate(int a1, int a2) {
       // System.out.println("calculate(int n1, int n2) 被调用");
       // return a1 + a2;
   // }
   //一个整数,一个 double 的和
   public double calculate(int n1, double n2) {
  return n1 + n2;
  }
   //一个 double ,一个 Int 和
   public double calculate(double n1, int n2) {
       System.out.println("calculate(double n1, int n2) 被调用..");
       return n1 + n2;
  }
   //三个 int 的和
   public int calculate(int n1, int n2, int n3){
  return n1 + n2 + n2;
  }
重载的好处

1) 减轻了起名的麻烦

2) 减轻了记名的麻烦

 

重载注意的事项

1)方法名:相同

2)返回值:无要求

3)形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)

 

可变参数

java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。

基本语法:

访问修饰符 返回类型 方法名(数据类型... 形参名) {

}

示例:

class HspMethod {
   //可以计算 2 个数的和,3 个数的和 , 4. 5, 。。
   //可以使用方法重载
   // public int sum(int n1, int n2) {//2 个数的和
  // return n1 + n2;
   // }
   // public int sum(int n1, int n2, int n3) {//3 个数的和
  // return n1 + n2 + n3;
   // }
   // public int sum(int n1, int n2, int n3, int n4) {//4 个数的和
  // return n1 + n2 + n3 + n4;
   // }
   //..... //上面的三个方法名称相同,功能相同, 参数个数不同-> 使用可变参数优化
   //1. int... 表示接受的是可变参数,类型是 int ,即可以接收多个 int(0-多)
   //2. 使用可变参数时,可以当做数组来使用 即 nums 可以当做数组
   //3. 遍历 nums 求和即可
   public int sum(int... nums) {
       //System.out.println("接收的参数个数=" + nums.length);
       int res = 0;
       for(int i = 0; i < nums.length; i++) {
       res += nums[i];
  }
   return res;
}

可变参数使用注意事项:

1)可变参数的实参可以有0个或任意个

2)可变参数的实参可以为数组和引用类型

3)可变参数的本质就是数组

4)可变参数可以和普通的参数一起放在形参列表,但必须保证可变参数在最后

 

作用域

1.java编程中变量就是属性(成员变量)和局部变量

2.我们所说的局部变量就是一般指在成员方法中定义的变量。

3.java中的作用域的分类

全局变量:也就是属性,作用域为整个类体

局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块

4.全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后才能使用,因为没有默认值。

 

示例:

class Cat {
   //全局变量:也就是属性,作用域为整个类体 Cat 类:cry eat 等方法使用属性
   //属性在定义时,可以直接赋值
   int age = 10; //指定的值是 10
   //全局变量(属性)可以不赋值,直接使用,因为有默认值,
   double weight; //默认值是 0.0
   public void hi() {
       //局部变量必须赋值后,才能使用,因为没有默认值
       int num = 1;
       String address = "北京的猫";
       System.out.println("num=" + num);
       System.out.println("address=" + address);
       System.out.println("weight=" + weight);//属性
  }
   public void cry() {
       //1. 局部变量一般是指在成员方法中定义的变量
       //2. n 和 name 就是局部变量
       //3. n 和 name 的作用域在 cry 方法中
       int n = 10;
       String name = "jack";
       System.out.println("在 cry 中使用属性 age=" + age);
  }
   public void eat() {
       System.out.println("在 eat 中使用属性 age=" + age);
       //System.out.println("在 eat 中使用 cry 的变量 name=" + name);//错误
  }
}
作用域的注意事项

1.属性和局部变量可以重名,访问时遵循就近原则。

2.同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。

3.属性的生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。

4.作用域范围不同

全局变量/属性:可以被本类使用,或者其他类使用。

局部变量:只能在本类中对应的方法中使用

5.修饰符不同

全局变量/属性可以加修饰符

局部变量不可以加修饰符

 

构造方法/构造器

基本语法

[修饰符] 方法名(形参列表){

方法体;

}

说明:

1)构造器可以默认,也可以是public,protected,private

2)构造器没有返回值

3)方法名和类名必须一样

4)参数列表和成员方法一样的规则

5)构造器的调用,由系统完成

 

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:

1) 方法名和类名相同

2) 没有返回值

3) 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化

 

注意事项

1.一个类可以定义多个不同的构造器,即构造器重载。

2.构造器名和类名要相同。

3.构造器没有返回值。

4.构造器是完成对象的初始化,并不是创建对象。

5.在创建对象时,系统自动的调用该类的构造方法

6.如果自己没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器)。

7.一旦定义了自己的构造器,默认的构造器就覆盖了,不能再使用默认的无参构造器,除非自己显示定义一个无参构造。

 

对象创建的流程分析

 

 

this关键字

java虚拟机会给每一个对象分配this,代表当前对象。

 

 

 

this的注意事项

1)this关键字可以用来访问本类的属性,方法,构造器

2)this 用于区分当前类的属性和局部变量

3)访问成员方法的语法:this.方法名(参数列表);

4)访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)

5)this 不能在类定义的外部使用,只能在类定义的方法中使用。

posted @ 2021-10-31 19:11  brysjs  阅读(133)  评论(0)    收藏  举报