JavaSE学习:第七章、方法重载、可变参数、作用域、构造器、this

1、定义:

一个类中,可以有多个同名方法,但是要求形参列表不一致

class B {
   public int calculate(int n1, int n2) {
       return n1 + n2;
   }
   
   public double calculate(int n1, double n2) {
       return n1 - n2;
   }
}

2、注意事项:

1、方法名:必须相同。
2、形参列表:必须不同(形参类型、个数、顺序)至少一样不同。
3、返回类型:无要求。

下面没有构成方法重载:形参列表一致

public int cal(int n1, int n2) {
	return n1 + n2
]

public void cal(int a1, int a2) {
	System.out.println(a1 + a2);
}

1、可变参数:

java运行将同一个类中多个同名同功能单参数个数不同的方法,封装成一个方法。

需求:求n1 + n2,n1 + n2 + n3,n1 + n2 + n3 + n4的值。

    public int sum(int n1, int n2) {
        return n1 + n2;
    }

    public int sum(int n1, int n2, int n3) {
        return n1 + n2 + n3;
    }

可以将sum当做数组看待:

    public int sum(int... sum) {
        int res = 0;
        for (int i = 0; i < sum.length; i++) {
            res += sum[i];
        }
        return res;
    }

2、可变参数注意事项:

1、实参可以是多个或者0个。
2、实参可以直接传入一个数组。
3、可变参数可以和形参一起存在,但是可变参数必须在最后。
4、一个方法最多一个可变参数。

public void fn(String str, int... sum) {

}

1、作用域;

1、全局变量(属性):作用域为整个类。
2、局部变量:作用域为定义它的代码块中,如方法中。
3、全局变量可以不赋值直接使用,有默认值;局部变量必须先赋值才能使用,因为无默认值。

class Person {
	int num;
	public void method() {
		int n1 = 10;
		System.out.println(num);
	}
}

2、注意事项:

1、属性和局部变量可以重名,访问时遵循就近原则。
2、在同一个作用域中,两个局部变量不能重名。
3、属性生命周期:伴随着对象的创建而创建,随着对象的死亡而死亡。
局部变量:随着它的代码块的执行而创建,随着代码块的介绍而死亡,即在方法调用中。
4、全局变量:可以被本类或者其它类调用(使用对象调用)
局部变量:只能在本类对应方法中使用。
5、全局变量:可以加修饰符。
局部变量:不可以加修饰符。

public class text {
    public static void main(String[] args) {
        B b = new B();
        A a = new A();
        a.test1();
        a.test2(b);

    }
}

class A {
    // 1、属性可以被本类或者其它类调用(第一种方法:方法中创建对象)
    public void test1() {
        B b = new B();
        System.out.println(b.name);  // jack
    }
    // 2、属性可以被本类或者其它类调用(第二种方法:直接传入对象)
    public void test2(B b) {
        System.out.println(b.name); // jack
    }
}

class B {
    String name = "jack";
}

1、构造器:主要作用是完成对象属性的初始化

1、如果在创建对象时,要直接给对象的属性赋值,就可以使用构造器。
2、一般给类一个无参构造一个有参构造器。

2、注意点:

1、构造器有修饰符。
2、构造器没有返回值。
3、方法名和类名一致。
4、构造器的调用,由系统完成(在new一个对象,会生成一个默认无参构造器)
5、如果指定了构造器,原来默认无参构造器被覆盖,就不可以使用了(就是你创建对象时必须赋值)

public class text {
    public static void main(String[] args) {
        A a = new A("张三", 20);
        A a2 = new A("李四");
        System.out.println(a.name);
        System.out.println(a.age);

    }
}

class A {
    String name;
    int age;
    public A(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public A(String name){
        this.name = name;
    }
}

3、细节;

1、一个类可以定义多个构造器:构造器重载。
2、构造器无返回值。
3、构造器是完成对象属性初始化,并不是创建对象。
4、创建对象时,系统自动调用该类的构造方法。

对象创建流程

1、加载类信息(Person.class),只会加载一次,就是再次创建对象也只是加载一次。
2、堆中分配空间/地址(new)。
3、完成对象初始化:
a、默认初始化:age=0;name=null
b、显示初始化:age=90;name=null
c、构造器初始化:age=20;name=小明
4、将堆中对象地址返回给对象的引用/对象名 p。
在这里插入图片描述

1、this关键字:

问题提出:如果将构造器中的参数名统一?

如果按照下面写法会显示null和0,因为按照作用域原则,两个name和两个age都是指的形参的name和age。那如何将左边name、age指向为类中的属性呢?

class A {
    String name;
    int age;
    public A(String name, int age) {
        name = name;
        age = age;
    }
}

2、this指向:

Jvm会给每一个对象分配this,因此this就指向当前对象。

class A {
    String name;
    int age;
    public A(String name, int age) {
      // this.name:就是当前对象的属性name
        this.name = name;
        this,age = age;
    }
}

哪个对象调用,this就指向哪个对象
在这里插入图片描述

3、this细节:

1、this关键字可以用来访问本类的属性、方法、构造器
2、this可以访问本类的成员方法:this.方法名(参数列表);
3、this可以在构造器中访问另一个构造器,但是必须放在第一条语句。
4、this可以访问父类的非私有属性和方法,但是是先从本类查找。

class A {
    String name;
    int age;
    public A(String name, int age) {
        this("黎明");
        this.name = name;  // null
        this.age = age;  // 0
    }
    
    public A(String name){
        this.name = name;
    }
    
    public void method1() {
        System.out.println("hello");
        this.method2();
    }
    
    public void method2() {
        System.out.println("word");
    }
}

4、练习题:

在这里插入图片描述

public class text {
    public static void main(String[] args) {
        Person person1 = new Person("liming",20);
        Person person2 = new Person("liming", 20);

        boolean b = person2.compareTo(person1);
        System.out.println(b);
    }
}

class Person {
    String name;
    int age;
    public boolean compareTo(Person p) {
        if (this.name.equals(p.name) && this.age == p.age) {
            return true;
        } else {
            return false;
        }
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

1、作业:

在这里插入图片描述

public class Homework {
    public static void main(String[] args) {
        double[] array = {11.1, 23.2, 32.4, 10.1, 30.1};
        Test test = new Test();
        double maxnumm = test.max(array);
        System.out.print(maxnumm);
    }
}

class Test {
    public double max(double[] array) {
        double maxNum = array[0];
        for (int i = 0; i < array.length; i++) {
            if (maxNum < array[i]) {
                maxNum = array[i];
            }
        }
        return maxNum;
    }
}

在这里插入图片描述

public class Homework {
    public static void main(String[] args) {
        String strArr[] = {"lisi", "wangwu", "zhangsan"};
        Test test = new Test();
        int res = test.find(strArr, "wangwu");
        System.out.println(res);
    }
}

class Test {
    public int find(String[] strArr, String str) {
        for (int i = 0; i < strArr.length; i++) {
            if (str.equals(strArr[i])) {
                return i;
            }
        }
        return -1;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值