java基础入门day18

day18

方法重载回顾

package com.saas;
​
public class TestOverLoad {
​
 public void m(int a, int b){
​
 }
//
//    public void m(int b, int a){      //  不能构成方法重载,编译会报错,与上面的m(int a, int b)是同一个方法,会出现二义性
//
//    }
​
 public void m(int b, double a){
​
 }
​
 public void m(double b, int a){     //  构成方法的重载,与上面的m(int, double)构成重载,参数的顺序不同。与上面的m(int, int)也构成重载,参数的类型不同
​
 }
​
 public void m(int a, double b, float c){        //  与上面的所有方法都构成重载,参数的个数不同
​
 }
​
​
}

构造方法

package com.saas;
​
public class Student {
​
    String name;
    int age;
    double score;
    boolean sex;
​
    public Student(){
        System.out.println("this is constructor without params.");
    }
​
    public Student(String name){
        System.out.println("this is constructor with name param.");
    }
​
    public Student(String name, int age){
        System.out.println("this is constructor with name and age params.");
    }
​
    public Student(String name, int age, boolean sex){
        System.out.println("this is constructor with name, age, sex params.");
    }
​
    public Student(String name, int age, boolean sex, double score){
        System.out.println("this is constructor with name, age, sex and score params.");
    }
}
package com.saas;
​
public class TestStudent {
​
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student("tangtang");
        Student s3 = new Student("tangtang", 30);
        Student s4 = new Student("tangtang", 30, true);
        Student s5 = new Student("tangtang", 30, true, 99);
​
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println(s1.sex);
        System.out.println(s1.score);
​
        System.out.println("==========================");
//
//        s.name = "wukong";
//        s.age = 500;
//        s.sex = true;
//        s.score = 99.99;
//
        System.out.println(s2.name);
        System.out.println(s2.age);
        System.out.println(s2.sex);
        System.out.println(s2.score);
​
        System.out.println("==========================");
​
        System.out.println(s3.name);
        System.out.println(s3.age);
        System.out.println(s3.sex);
        System.out.println(s3.score);
​
        System.out.println("==========================");
​
        System.out.println(s4.name);
        System.out.println(s4.age);
        System.out.println(s4.sex);
        System.out.println(s4.score);
​
        System.out.println("==========================");
​
        System.out.println(s5.name);
        System.out.println(s5.age);
        System.out.println(s5.sex);
        System.out.println(s5.score);
    }
}

最终的运行结果如下:

this is constructor without params.
this is constructor with name param.
this is constructor with name and age params.
this is constructor with name, age, sex params.
this is constructor with name, age, sex and score params.
null
0
false
0.0
==========================
null
0
false
0.0
==========================
null
0
false
0.0
==========================
null
0
false
0.0
==========================
null
0
false
0.0

以上代码中,分别调用了五个构造方法,创建了五个对象,分别是无参,一参,两参, 三参和四餐

但是注意一个问题,对于带有参数的构造方法的调用,虽然给了参数,但是这个参数仅仅只是构造器的形参通过实参赋值,但是没没有真正给全局属性赋值,所以此程序打印的四个属性继续保持为各个属性的零值

package com.saas;
​
public class Student02 {
​
    String name;
    int age;
    double score;
    boolean sex;
​
    public Student02(){
        System.out.println("this is constructor without params.");
    }
​
    public Student02(String n){
        System.out.println("this is constructor with name param.");
        name = n;
    }
​
    public Student02(String n, int a){
        System.out.println("this is constructor with name and age params.");
        name = n;
        age = a;
    }
​
    public Student02(String n, int a, boolean se){
        System.out.println("this is constructor with name, age, sex params.");
        name = n;
        age = a;
        sex = se;
    }
​
    public Student02(String n, int a, boolean se, double sc){
        System.out.println("this is constructor with name, age, sex and score params.");
        name = n;
        age = a;
        sex = se;
        score = sc;
    }
}
package com.saas;
​
public class TestStudent02 {
​
    public static void main(String[] args) {
        Student02 s1 = new Student02();
        Student02 s2 = new Student02("tangtang");       //  虽然"tangtang"给了Student中带name参数的构造器里面的name参数,但是最终打印的是全局变量name,该tangtang只是构造器里面的参数的name,跟全局变量没有关系
        Student02 s3 = new Student02("tangtang", 30);
        Student02 s4 = new Student02("tangtang", 30, true);
        Student02 s5 = new Student02("tangtang", 30, true, 99);
​
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println(s1.sex);
        System.out.println(s1.score);
​
        System.out.println("==========================");
//
//        s.name = "wukong";
//        s.age = 500;
//        s.sex = true;
//        s.score = 99.99;
//
        System.out.println(s2.name);
        System.out.println(s2.age);
        System.out.println(s2.sex);
        System.out.println(s2.score);
​
        System.out.println("==========================");
​
        System.out.println(s3.name);
        System.out.println(s3.age);
        System.out.println(s3.sex);
        System.out.println(s3.score);
​
        System.out.println("==========================");
​
        System.out.println(s4.name);
        System.out.println(s4.age);
        System.out.println(s4.sex);
        System.out.println(s4.score);
​
        System.out.println("==========================");
​
        System.out.println(s5.name);
        System.out.println(s5.age);
        System.out.println(s5.sex);
        System.out.println(s5.score);
    }
}

最终的运行结果如下

this is constructor without params.
this is constructor with name param.
this is constructor with name and age params.
this is constructor with name, age, sex params.
this is constructor with name, age, sex and score params.
null
0
false
0.0
==========================
tangtang
0
false
0.0
==========================
tangtang
30
false
0.0
==========================
tangtang
30
true
0.0
==========================
tangtang
30
true
99.0

这两个类与上面两个类的区别是,这两个类中的带参构造器里面将形参给全局变量做了额外的赋值

因此打印各自对象的时候,会分别打印赋过值之后的属性的真实值

this关键字

类是模板,可服务于此类的所有对象

this是类中的默认引用,代表当前实例

当类服务于某个对象时,this则指向这个对象

package com.saas;
​
public class Student03 {
​
    String name;
    int age;
    double score;
    boolean sex;
​
    public Student03(){
        System.out.println("this is constructor without params.");
    }
​
    public Student03(String name){
        System.out.println("this is constructor with name param.");
        name = name;        //  name赋值给name,相当于把自己赋值给自己,没有意义
        /*
        //  this代表当前对象,类是模板,可赋予与此类的所有对象,this是类中的默认引用,代表的是当前实例,当类服务于某个对象是,this则指向当前这个对象
        所以此次赋值是将形参的name赋值给全局的实例变量name,因为this.name代表的是全局的实例变量name
        而name前面没有加任何限定,则代表的是当前的形参name
         */
        this.name = name;
    }
​
    public Student03(String name, int age){
        System.out.println("this is constructor with name and age params.");
        this.name = name;
        this.age = age;
    }
​
    public Student03(String name, int age, boolean sex){
        System.out.println("this is constructor with name, age, sex params.");
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
​
    public Student03(String name, int age, boolean sex, double score){
        System.out.println("this is constructor with name, age, sex and score params.");
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.score = score;
    }
}
package com.saas;
​
public class TestStudent03 {
​
    public static void main(String[] args) {
        Student03 s1 = new Student03();
        Student03 s2 = new Student03("tangtang");       //  虽然"tangtang"给了Student中带name参数的构造器里面的name参数,但是最终打印的是全局变量name,该tangtang只是构造器里面的参数的name,跟全局变量没有关系
        Student03 s3 = new Student03("tangtang", 30);
        Student03 s4 = new Student03("tangtang", 30, true);
        Student03 s5 = new Student03("tangtang", 30, true, 99);
​
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println(s1.sex);
        System.out.println(s1.score);
​
        System.out.println("==========================");
//
//        s.name = "wukong";
//        s.age = 500;
//        s.sex = true;
//        s.score = 99.99;
//
        System.out.println(s2.name);
        System.out.println(s2.age);
        System.out.println(s2.sex);
        System.out.println(s2.score);
​
        System.out.println("==========================");
​
        System.out.println(s3.name);
        System.out.println(s3.age);
        System.out.println(s3.sex);
        System.out.println(s3.score);
​
        System.out.println("==========================");
​
        System.out.println(s4.name);
        System.out.println(s4.age);
        System.out.println(s4.sex);
        System.out.println(s4.score);
​
        System.out.println("==========================");
​
        System.out.println(s5.name);
        System.out.println(s5.age);
        System.out.println(s5.sex);
        System.out.println(s5.score);
    }
}

运行结果如下:

this is constructor without params.
this is constructor with name param.
this is constructor with name and age params.
this is constructor with name, age, sex params.
this is constructor with name, age, sex and score params.
null
0
false
0.0
==========================
tangtang
0
false
0.0
==========================
tangtang
30
false
0.0
==========================
tangtang
30
true
0.0
==========================
tangtang
30
true
99.0

代码中this.Xxxx = xxx;意思是将形参中的xxx赋值给全局 变量的Xxx

this关键字构造器的调用

package com.saas;
​
public class Student04 {
​
    String name;
    int age;
    double score;
    boolean sex;
​
    public Student04(){
        System.out.println("this is constructor without params.");
    }
​
    public Student04(String name){
        this();
        System.out.println("this is constructor with name param.");
        this.name = name;
    }
​
    public Student04(String name, int age){
        this(name);
        System.out.println("this is constructor with name and age params.");
        this.age = age;
    }
​
    public Student04(String name, int age, boolean sex){
        this(name, age);
        System.out.println("this is constructor with name, age, sex params.");
        this.sex = sex;
    }
​
    public Student04(String name, int age, boolean sex, double score){
        this(name, age, sex);
        System.out.println("this is constructor with name, age, sex and score params.");
        this.score = score;
    }
​
    public void sayHi(){
        System.out.println("name:\t" + name);
        System.out.println("age:\t" + age);
        System.out.println("sex:\t" + sex);
        System.out.println("score:\t" + score);
​
        System.out.println("********************");
​
        System.out.println("name:\t" + this.name);
        System.out.println("age:\t" + this.age);
        System.out.println("sex:\t" + this.sex);
        System.out.println("score:\t" + this.score);
    }
}
package com.saas;
​
public class TestStudent04 {
​
    public static void main(String[] args) {
        Student04 s1 = new Student04();
        Student04 s2 = new Student04("tangtang");       //  虽然"tangtang"给了Student中带name参数的构造器里面的name参数,但是最终打印的是全局变量name,该tangtang只是构造器里面的参数的name,跟全局变量没有关系
        Student04 s3 = new Student04("tangtang", 30);
        Student04 s4 = new Student04("tangtang", 30, true);
        Student04 s5 = new Student04("tangtang", 30, true, 99);
​
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println(s1.sex);
        System.out.println(s1.score);
​
        System.out.println("--------------------------");
​
        s1.sayHi();
​
        System.out.println("==========================");
//
//        s.name = "wukong";
//        s.age = 500;
//        s.sex = true;
//        s.score = 99.99;
//
        System.out.println(s2.name);
        System.out.println(s2.age);
        System.out.println(s2.sex);
        System.out.println(s2.score);
​
        System.out.println("--------------------------");
​
        s2.sayHi();
​
        System.out.println("==========================");
​
        System.out.println(s3.name);
        System.out.println(s3.age);
        System.out.println(s3.sex);
        System.out.println(s3.score);
​
        System.out.println("--------------------------");
​
        s3.sayHi();
​
        System.out.println("==========================");
​
        System.out.println(s4.name);
        System.out.println(s4.age);
        System.out.println(s4.sex);
        System.out.println(s4.score);
​
        System.out.println("--------------------------");
​
        s4.sayHi();
​
        System.out.println("==========================");
​
        System.out.println(s5.name);
        System.out.println(s5.age);
        System.out.println(s5.sex);
        System.out.println(s5.score);
​
        System.out.println("--------------------------");
​
        s5.sayHi();
    }
}

在构造器内部还可以通过this关键字调用当前类的其他构造器

this后面直接跟括号,不能跟属性运算符“.”

构造器中调用其他构造方法的代码必须写在方法体内部的第一行

一定要注意避免递归构造,不管是自己调用自己,还是大的循环之后再调用自己

构造方法的重载

构造方法的重载得同时满足两个条件:

  • 必须是构造方法

    • 方法名必须与类名完全相同

    • 方法必须没有返回值类型

  • 必须满足方法重载的定义

    • 多个方法的方法名相同

    • 参数列表不同

最终构造方法的重载得同时满足三个条件

  • 所有方法的方法名都必须与类名完全相同

  • 所有的方法都必须有同步的参数列(个数、顺序和类型)

  • 所有的方法都必须没有返回值类型

package com.saas;
​
public class Point {
    
    int x;
    int y;
    int z;
    
    public Point(){
        
    }
    
    public Point(int x){
        this.x = x;
    }
    
    public Point(int x, int y){
        this(x);
        this.y = y;
    }
​
    public Point(int x, int y, int z){
        this(x, y);
        this.z = z;
    }
​
    public void printDetail(){
        System.out.println("(" + x + ", " + y + ", " + z + ")");
    }
}
package com.saas;
​
public class TestPoint {
​
    public static void main(String[] args) {
        Point p1 = new Point();
        Point p2 = new Point(10);
        Point p3 = new Point(10, 20);
        Point p4 = new Point(10, 100, 100);
​
        p1.printDetail();
        p2.printDetail();
        p3.printDetail();
        p4.printDetail();
    }
}

上面Point类中的四个Point方法构成了构造方法的重载

方法名都与类名完全相同,都叫Point

方法都没有返回值类型

方法的参数列表各不相同,个数不一样

上面的Student类、Student01类、Student02类、Student03类里面的五个Student方法也构成了各自类中重载

一个类中如果没有显式地定义任何构造方法,java虚拟机会帮助我们定义一个默认无参的构造器

但是当一个类中已经定义了构造方法时,java虚拟机不再为我们提供默认无参的构造器

构造方法内部调用其他构造方法,使用this()来进行调用

如果在实例方法内调用构造方法,使用new后面跟构造器来创建对象2

总结

什么是对象:

一切客观存在的事物都是对象,万事万物皆对象

什么是类:

定义了对象的特征和行为的java的最小组织单元,类是对象的模板

什么是方法的重载:

方法名相同,参数列表不同的同一个类中的多个方法

什么是构造方法:

类中用于创建或者初始化对象的特殊方法,方法名与类名完全相同,没有返回值类型,不可以通过句点来调用

构造方法的重载:方法名都与类名完全相同,方法都必须没有返回值类型,方法的参数列表均不相同

什么是this关键字:

this代表的是当前实例对象,通过this.可以访问类中的实例变量和实例方法,统称为实例成员,通过this()/this(xxx)可以在当前类的构造器中再次调用其他的构造器,要注意在构造器中调用其他构造器的代码必须放在方法体的第一行

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值