六, 面向对象的思想(二)
六, 面向对象的思想(二)
方法的重载
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(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)

浙公网安备 33010602011771号