方法重载
java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致。
使用方法重载,减轻了起名和记名的麻烦。
//实现一个方法重载
class Calculator {
//整数+整数
public int calculate(int num1 , int num2){
return num1 + num2;
}
//浮点数+整数
public double calculate(double num1 , int num2){
return num1 + num2;
}
//整数+浮点数
public double calculate(int num1 , double num2){
return num1 + num2;
}
//整数+整数+整数
public int calculate(int num1 , int num2 , int num3){
return num1 + num2 + num3;
}
}
注意事项:
1)方法名必须相同
2)参数列表必须不同(参数类型、个数、顺序,至少一个不同)
3)返回类型没有要求
//例题:定义三个重载方法
//求2个int数中最大值
//求2个double数最大值
//求3个数最大值
class Max{
public int max(int num1 , int num2){
return num1 > num2 ? num1 : num2;
}
public double max(double num1 , double num2){
return num1 > num2 ? num1 : num2;
}
public int max(int num1 , int num2 , int num3){
return (num1 > num2 ? num1 : num2) > num3 ?
(num1 > num2 ? num1 : num2):num3;
}
}
可变参数
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
访问修饰符 数据类型 方法名(数据类型... 变量名)
//例如: 求两数和,求三数和,求四数和,求五数和......
// 在此时,若分别写出每一个函数,太过于繁琐,
// 可以在此时利用可变参数列表,封装为一个方法,传入任意数量的参数
// 都可以求其和
class Sum{
public int sum(int... nums){
//将传入的参数以数组的形式展现
//nums的本质是一个数组
int re = 0;
for (int i = 0; i < nums.length; i++ ){
re += nums[i];
}
return re;
}
}
注意事项:
1)可变参数的实参可以为0个或任意多个。
2)可变参数的实参可以为数组。可变参数的本质为数组。
4)可变参数可以和普通类型的参数一起放在形参列表,但必须可变参数在最后
//演示:
public void spp(String sp, int... p){
......
}
5)一个形参列表中只能出现一个可变参数
作用域
1)在java编程中,主要的变量就是属性(成员变量)和局部变量。
2)我们说的局部变量一般是指在成员方法中定义的变量。
全局变量:也就是属性,作用域为整个类
局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
【全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值】
class Person{
String name; // 全局变量 --- 有默认值 --- 作用范围 整个类
int age; // 全局变量 --- 有默认值 --- 作用范围 整个类
String gender; // 全局变量 --- 有默认值 --- 作用范围 整个类
public void speak(){
//全局变量可以在 类中任意位置被调用
//name全局变量
System.out.println("My name is " + name);
}
public int card(){
// 局部变量
// --- 没有默认值 需要赋初始值
// --- 作用范围 只能在该方法中调用
double money = 100;
}
//简单记法:
//{}以中括号为判别,其定义为位置以中括号{}为一个完整的作用范围
}
注意事项:
1)属性和局部变量可以重名,访问时遵循就近原则。
class Person{
//全局变量
String name = "小王";
public void speak(){
String name = "小李";
System.out.println("my name is "+name);
//按就近原则:
//my name is 小李
}
}
2)在一个作用域中,两个局部变量,或两个全局变量,不能重名。
3)生命周期
全局变量:生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
局部变量:生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。
4)作用域范围不同
全局变量:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5)修饰符不同
全局变量:可以加修饰符
局部变量:不可以加修饰符
this关键字
this代指当前对象。
class Person{
String name;
int age;
}
//main函数
public static void main(String[] args){
Person p1 = new Person();
// new Person() 是对象本身
// p1 中存储的 只是对象在堆区中的地址
// this 是每一个对象 隐含存在的值 --- 记录着自己的对象的地址
// this中的值就是堆区中自己对象的地址
// 假设 生成对象的地址 为 0x123456
// p1 ---> 0x123456
// this ---> 0x123456、
//所以可以自己调用自己内部的成员变量或方法 (只能在本类中使用)
// 简单来说:哪个对象调用它,this就代表那个对象
Dog d1 = new Dog();
d1.name = "旺财";
d1.speak; // bark bark bark 旺财
Dog d2 = new Dog();
d2.name = "假旺财";
d2.speak; // bark bark bark 假旺财
}
class Dog{
String name;
public void speak(){
System.out.println("bark bark bark " + this.name);
}
}
注意事项:
1)this关键字可以用来访问本类的属性、方法、构造器
2)this可以区分当前类的属性和局部变量
3)访问成员方法的语法:this.方法名(参数列表);
4)访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造
器中访问另外一个构造器,必须放在第一条语句)
class Person{
String name;
Person(){
this("小王"); // 必须放在第一条语句
// 具体原因 --- 在继承中会进行解释
System.out.println("无参构造器");
}
public Person(String name){
System.out.println("有参构造器");
}
}
5)this不能在类定义的外部使用,只能在类定义的方法中使用。
构造器
构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
1)无参数构造器:(若未写任何构造器,则默认存在无参构造器)
初始化一个类的对象、并返回这个对象的地址、里面的数据都是默认值
2)有参数构造器:
初始化一个类的对象、并返回这个对象的地址,并且可以同时为对象赋值
构造器的特点
1)方法名和类名相同
2)没有返回值
3)在创建对象时,系统会自动的调用构造器完成对类的初始化
class Person{
String name;
int age;
// 无参构造器 --- 系统默认存在 (在用户定义构造器后,将会被覆盖)
Person(){}
// 有参构造器
public Person(String name , int age){
this.name = name;
this.age = age;
}
//注意!!!
//如果你在这个类中定义了一个有参数构造器了,那么无参数构造器就消失了,
//此时没如果你还要使用无参数构造器,你必须自己写一个
}
注意事项:
一旦定义了自己的构造器,默认的构造器就覆盖了,就不可以再使用默认的无参构造器,除非显式的定义一下
//演示
public static void main(String[] args){
//情况一
Person p1 = new Person();
// 程序不会报错,p1中name存储默认值 --- 存在无参构造器
//情况二
Person p2 = new Person(); //X 报错 --- 无参构造器已经不存在了
Person p2 = new Person("小王") // 只可利用有参构造器
//情况三 (推荐形式)
Person p3 = new Person();
Person p3 = new Person("小王");
//两者都可使用
}
//情况一
class Person{
String name;
}
//情况二
class Person{
String name;
// 定义了有参数构造器后 , 将原来的无参构造器覆盖了
public Person(String name){
this.name = name;
}
}
//情况三
class Person{
String name;
// 定义无参数构造器
Person(){
}
// 定义有参数构造器
public Person(String name){
this.name = name;
}
}
练习题
1、利用方法重载并调用,分别计算2*1.3*4,2*11*4*6*12*9,3*1.3*0.7的值
class Calcultor{
public double mul(int num1, double num2, int num3){
return num1*num2*num3;
}
public double mul(int... nums){
int re = 0;
for (int i = 0; i < nums.length; i++ ){
re *= nums[i];
}
return re;
}
public double mul(int num1, double num2,double num3){
return num1*num2*num3;
}
}
public static void main(String[] args){
Calcultor n = new Calcultor();
n.mul(2,1.3,4);
n.mul(2,11,4,6,12,9);
n.mul(3,1.3,0.7);
}
2、创建公司对象,名称:侠客公司,老板:BOSS,员工数量:1000,市场价值:12345678910.99。【要求:使用this和构造器】
class Company{
String name;
String top;
int member;
double price;
Company(){}
public Company( String name,String top,int member,double price){
this.name = name;
this.top = top;
this.member = member;
this.price = price;
}
}
public static void main(String[] args){
Company C1 = new Company("侠客公司","BOSS",1000,12345678910.99);
}