Java面向对象-方法与方法重载

本文介绍了Java中的方法定义、参数传递、构造方法(包括无参和带参)、this关键字的应用、方法重载以及成员变量和局部变量的区别,帮助读者掌握基础编程概念。
摘要由CSDN通过智能技术生成

方法与方法重载



前言

在方法与方法重载中,需要了解方法的参数传递、使用构造方法、掌握方法重载、使用成员变量和局部变量


一、方法的参数传递

1、定义带参数的方法

<访问修饰符> 返回类型 <方法名>(形参列表) {
		// 方法的主体
}

2、调用带参数的方法

对象名.方法名(参数1,参数2,......参数n,实参列表)

3、带参方法实现案例

在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功

public class StudentUtils {

    // 在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功
    // 返回值类型为布尔值
    public static boolean searchStudent(String[] studentNames,int begin,int end,String name){
        // 首先判断你输入的索引是否处于数组的索引范围之内
        if(begin<0 || end>studentNames.length-1){
        // 否则返回false
            return false;
        }

        // 使用循环的方式将你要查找的姓名在数组一一进行比较,如果数组有元素与查找姓名相同,就返回true
        for(int i =begin;i < end;i++){
            if(name.equals(studentNames[i])){
                return true;
            }
        }

        return false;
    }
}
public class StudentTest {
    public static void main(String[] args) {

        // 首先准备一个student姓名的数组
        String[] names = {"张三","李四","王五","赵六","孙七","吴八","周九"};

        // 查询names数组中下标2-5这个区间内是否有张三
        boolean result =StudentUtils.searchStudent(names,2,5,"赵六");
        System.out.println("我要查找的姓名在指定区间是存在的:"+result);

    }
}

4、方法传参

基本数据类型,操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值

引用数据类型(类、数组、接口),赋值是把原对象的引用(内存地址)传递给另一个引用

public class Student {
    //定义两个属性
    public String name;
    public int age;

}
public class Test {
    // 定义2个方法
    public void calc1(int num){
    // n = 8 值传给了 num
        num=num+1;
        System.out.println("num:"+num); // num = 9
    }
// 传一个对象 对象是一个容器 容器里面包含很多属性
    public void calc2(Student student){
        student.age=student.age+1;
        System.out.println("stuage:"+student.age); // stuage:19
    }


    public static void main(String[] args) {
    // 测试类
        Test test=new Test();
        int n=8;
        test.calc1(n);
        System.out.println("n="+n); // n = 8

        // 创建Student对象,并给age属性赋值
        Student stu=new Student();
        stu.age=18;
        System.out.println("student.age="+stu.age); // student.age=18
        test.calc2(stu); // 传Student创建的对象stu
        System.out.println("student.age="+stu.age); // student.age=19
    }

}

5、对象数组

即创建的对象放在同一个数组中

// 定义一个Dog类,类也是一种数据类型,是我们自己定义的数据类型
public class Dog {
    // 定义属性
    public String name;
    public int age;
    public char gender;

    // 定义方法
    public void eat(){
        System.out.println("狗吃肉......");
    }

    public void shout(){
        System.out.println("汪汪汪......");
    }
}
public class DogTest {

    public static void main(String[] args) {
        // 创建3个Dog类对象
        // 对象也可以理解为一个容器,这个容器中可以存储多个不同类型的数据(即对象的属性)
        // 至于这个对象能够存储多少个数据取决于对象的类里定义了多少个属性
        Dog dog1 = new Dog();
        // 给属性赋值
        dog1.name = "奥迪";
        dog1.age = 2;
        dog1.gender = '公';

        Dog dog2 = new Dog();
        // 给属性赋值
        dog2.name = "宝马";
        dog2.age = 2;
        dog2.gender = '母';

        Dog dog3 = new Dog();
        // 给属性赋值
        dog3.name = "奔驰";
        dog3.age = 2;
        dog3.gender = '公';

        // 将这个三个dog对象存储到数组中
        // 数据类型[] 数组名 = new 数据类型[数组长度];
        // 数据类型[] 数组名 = new 数据类型[]{数据1,数据2,...,数据n};
        // 数据类型[] 数组名 = {数据1,数据2,...,数据n};
        Dog[] dogs = {dog1,dog2,dog3}; // 

        // 取出数组中第一个元素,数组中的元素是dog对象,直接输出对象,输出的是地址值
        System.out.println(dogs[0]);
        // 可以输出取出来的对象的属性值
        System.out.println(dogs[0].name);
        System.out.println(dogs[0].age);
        System.out.println(dogs[0].gender);

        System.out.println("--------------------");

        // 遍历dogs数组,输出数组中所有dog对象的所有属性值
        for(int i =0;i< dogs.length;i++){
            System.out.println(dogs[i].name);
            System.out.println(dogs[i].age);
            System.out.println(dogs[i].gender);
            System.out.println("--------------------");
        }


    }
}

二、构造方法

无参构造方法,每个类都有个默认无参构造方法

Student student = new Student();

带参构造方法

Student stu = new Student("张三",40);

构造方法的特点

1)构造方法没有返回值,void也不写

2)构造方法的名称与类名相同

3)当你在类中添加了其它的构造方法,会覆盖类中默认添加的无参构造方法,如果你还需要使用无参构造方法,就需要手动添加一个

public class Animal {

	// 定义属性
	public String type;
	public String name;
	public int age;
	public char gender;
	public double height;
	public double weight;
	public String color;
	
	// 每定义一个类,系统默认给这个类添加一个无参构造方法,并且隐藏不显示

    /*
    构造方法:
        访问修饰符 类名([形参列表]){

        }
    * 构造方法的特点:
    *   1)构造方法没有返回值,void也不写
    *   2)构造方法的名称与类名相同
    *   3)当你在类中添加了其它的构造方法,会覆盖类中默认添加的无参构造方法,如果你还需要使用无参构造方法,就需要手动添加一个
    * */
    
    // 定义一个无参构造方法
    public Animal(){

    }

    // 定义有参构造方法
    // 这个有参构造方法中的形参没有做到见名知意,在调用的时候,无法通过参数名称知道参数代表的含义
    /*
    public Animal(String a,String b,int c,char d,double e,double f,String g){
        type =a;
        name=b;
        age=c;
        gender=d;
        height=e;
        weight=f;
        color=g;
 	}
 	*/

    public Animal(String type,String name,int age,char gender,double height,double weight,String color){
        // 当你调用有参构造方法传递参数时,参数的值应该传递给创建的对象的属性
        // 但是这里形参名称和属性形成一致,方法里面会将形参的值再次传递给了形参,没有传递到创建的对象的属性中
        /*
        type =type;
        name=name;
        age=age;
        gender=gender;
        height=height;
        weight=weight;
        color=color;
        */
        
        // 在这里使用this关键字表示你创建的对象,谁调用该构造方法,this就表示谁
        this.type =type;
        this.name=name;
        this.age=age;
        this.gender=gender;
        this.height=height;
        this.weight=weight;
        this.color=color;
    }

    // 定义一个方法实现输出对象的属性信息
    public void printInfo(){
        System.out.println(type+"-"+name+"-"+age+"-"+gender+"-"+height+"-"+weight+"-"+color);
    }

}
public class AnimalTest {
    public static void main(String[] args) {
    
        // 创建Animal对象
        // 类名 对象名 = new 类名();--->使用无参构造方法创建对象
        Animal animal1 = new Animal();
        // 给对象属性赋值
        animal1.type = "狗";
        animal1.name = "旺财";
        animal1.age = 3;
        animal1.gender = '公';
        animal1.height = 90;
        animal1.weight = 85.5;
        animal1.color = "黄色";
        animal1.printInfo();

        // 通过有参构造方法创建Animal类对象--->你看看多省事
        Animal animal2 = new Animal("猫","Tom",2,'母',25.2,8.3,"白色");
        animal2.printInfo();

        Animal animal3 = new Animal("猪","香猪",3,'公',21.2,6.5,"黑白色");
        animal3.printInfo();
    }
}

三、this关键字

public class Worker {
    // 定义属性
    public String name;
    public int age;
    public char gender;
    public double height;
    public double weight;
    public String phone;
    public String address;
    public double salary;

    // 添加一个无参构造方法
    public Worker() {
        System.out.println("Worker类里的无参构造方法");
    }

    public Worker(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public Worker(String name, int age, char gender, double height, double weight, String phone, String address, double salary) {
        this(); // 在一个构造方法中通过this去调用其它构造方法,调用代码必须写在构造方法的第一行
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.height = height;
        this.weight = weight;
        this.phone = phone;
        this.address = address;
        this.salary = salary;
        // this(); 写在这里就会报错
    }

    // 定义一个方法输出对象的属性信息
    public void printInfo(){
        System.out.println("姓名:"+this.name+",年龄:"+this.age);
    }

    // 定义方法
    public void m1(){
        System.out.println("m1()方法");
    }

    public void m2(){
        System.out.println("m2()方法");
        this.m1();
    }
}
public class WorkerTest {

    public static void main(String[] args) {

        Worker worker1 = new Worker();

        Worker worker2 = new Worker("张三",28,'男',178,78,"13612345678","安徽合肥",8200);
    }
}

四、方法重载

1、自定义构造方法(在同一个类中)

1)方法名相同

2)参数列表不同

3)与返回值、访问修饰符无关

2、此时系统不再提供默认无参构造方法

3、普通方法也可以重载

五、成员变量和局部变量

变量的作用范围由花括号{ }来决定

变量声明的位置决定变量作用域

变量作用域确定可在程序中按变量名访问该变量的区域

1、作用域不同

1)成员变量的作用域在整个类内部都是可见的

2)局部变量的作用域仅限于定义它的方法

2、初始值不同

1)Java会给成员变量一个初始值

2)Java不会给局部变量赋予初始值

3、注意

1)在同一个方法中,不允许有同名局部变量

2)在不同的方法中,可以有同名局部变量

3)在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级

public class Demo01 {
    // 成员变量(全局变量):在类中、在方法外,声明的变量
    int num1 = 100;
    // int num1 = 200; 在同一个类中,不能有同名的成员变量
    static int num2 = 200; // 声明静态的变量num2

    public void m1(){
        System.out.println("num1="+num1);
        System.out.println("num2="+num2);
    }

    public void m2(){
        // 局部变量:在方法中或者其他结构中声明的变量,其作用范围就是方法内或者某个结构内
        int num4 =400;
        // int num4 = 300; 在同一个方法或者结构中,不能有同名的局部变量
        System.out.println("num4:"+num4);
        int num1 = 2000;
        // 成员变量和局部变量可以同名
        System.out.println("num1:"+num1);
    }

    public void m3(){
        // 在不同的方法或者结构内,可以有同名的局部变量
        int num4 = 500;
        System.out.println("num4:"+num4);
    }

    public static void main(String[] args){
       // System.out.println("num1:"+num1); // 静态方法中只能访问静态的成员变量,不能访问非静态的成员变量
        System.out.println("num2:"+num2);

        int num3 = 300;

        for(int i =1;i<=5;i++){
            System.out.println("num3:"+num3);
        }

        for(int j =1;j<=3;j++){ // j是局部变量
            System.out.println(j);
        }

        // System.out.println(j); j是在for循环中声明的,它的作用范围仅限于for循环
    }
}
public class Demo02 {
    // 声明一个全局变量
    int num1 =100;
    // 全局变量可以不赋值,因为全局变量有默认值
    int num2;

    public void m1(){
        // 成员变量和局部变量可以同名,但是局部变量具有更高的优先级
        // int num1 = 200;
        // 局部变量没有默认的初始值,在使用前必须赋值
        int num3;
        System.out.println("num1="+num1);
        System.out.println("num2:"+num2);
        num3 = 300;
        System.out.println("num3:"+num3);
    }

    public static void main(String[] args) {
        // 创建Demo02类对象
        Demo02 demo02 = new Demo02();

        // 调用m1()方法
        demo02.m1();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值