Java构造方法 重载与重写

部分内容引自《Java语言程序设计》一书,摘抄以便记忆和回顾

一、Java中的构造方法

构造方法的特性:

1.必须具备和所在类相同的名字
2.没有返回值类型,连void 也没有
3.构造方法是在创建一个对象使用 new 操作符时候调用的
4.构造方法的作用是初始化对象,也可以重载(即-可以有多个同名的构造方法,但是需要有不同的签名)

  • 一个类可以不定义构造方法,类中会隐含创建一个方法体为空的构造方法(类中没有明确定义构造方法时会提供)【文末示例二】
  • 构造方法是用来构造对象的,使用 new 操作符调用构造方法。
  • 拓展:基本类型和引用类型的区别
    • 每个变量都代表一个存储值的内存位置
    • 声明一个变量,就是告诉编译器这个变量可以存放什么类型的值
    • 区别:对于基本类型变量,对应内存索存储的值是基本类型值。对于引用类型变量来说,对于内存索存储的值是一个引用(即对象的地址)
      在这里插入图片描述

构造方法示例一:

// 构造方法示例一
// 代码来自《Java语言程序设计》一书的改造,摘抄以便记忆和回顾
public class Circle {
    double radius = 1;
    public static void main(String[] args){
        Circle myCircle1 = new Circle();   // 使用无参构造方法创建对象
        Circle myCircle2 = new Circle(2.0); // 使用 有参构造方法创建对象

        System.out.println(myCircle1.getArea());    //  6.283185307179586
        System.out.println(myCircle2.getArea());    // 12.566370614359172
    }

    Circle(){  // 无参构造方法
    }
    Circle(double newRadius){  // 有构造方法
        radius = newRadius;
    }

    double getArea(){   //普通方法
        return  2 * radius * Math.PI;
    }
}

构造方法示例二:

// 构造方法示例二
/**
 * 也可以不定义构造方法,会默认创建空方法体的构造方法(在没有创建任何构造方法的前提下)
 */
public class SampleCircle {

    double radius = 1;

    public static void main(String[] args){
        SampleCircle mySampleCircle = new SampleCircle();
        System.out.println(mySampleCircle.getArea());   //  6.283185307179586
    }
    double getArea(){   //普通方法
        return  2 * radius * Math.PI;
    }

}

二、Java方法重载与重写的区别
区别:
  • 重载是由静态类型确定的,在类加载的时候即可确定,属于静态分派
  • 重写是由动态类型确定的,是在运行时确定的,属于动态分派
  • 动态分派是由虚方法表实现的,虚方法表中存在着各个方法的实际入口地址
  • 如果父类中的某个方法,在子类中没有重写,则子类和父类的方法表中的这个方法地址相同
  • 如果子类重写了此方法,则子类方法表的地址指向重写后的地址。

重载

重载是指在同一个类中,有多个方法名相同(如前面的一个类中的多个构造方法也是重载),参数列表不同(参数个数/类型)可以理解为重载是一个类中的多态

示例三:

// Add.java 方法重载示例
public class Add {

    public static void main(String[] args){
        Add testAdd = new Add();
        int add1 = testAdd.add();
        int add2 = testAdd.add(2);
        float add3 = testAdd.add(1.5F,2);

        System.out.println("构造方法1:" + add1 + "\n构造方法2:" + add2 + "\n构造方法3:" + add3);
    }

    // 构造方法示例
    public int add(){
        return 1+1;
    }
    public int add(int a){
        return a + 1;
    }
    public float add(float a,int b){
        return a + b;
    }
}

运行结果:
构造方法1:2
构造方法2:3
构造方法3:3.5

重写

发生在子类继承父类,子类重写父类的方法,通过动态绑定
如果子类中的方法与父类中的某一方法,具有相同的方法名、返回类型、参数表 则新方法将覆盖原有的方法。如需原有的方法可以使用super关键字,该关键字引用当前类的父类。
子类的修饰符权限不能少于父类

方法重写示例:
//基类 Animal.java
public class Animal {
    public void whatAnimal(){
        System.out.println("我是小猫...");
    }
}
// 继承并含重写方法的 ExtendsAnimal.java
public class ExtendsAnimal extends Animal {
    public static void main (String[] args){
        ExtendsAnimal extendsAnimal = new ExtendsAnimal();
        extendsAnimal.whatAnimal();
    }

    // 重写  加上注解 @Override
    @Override
    public void whatAnimal(){
        System.out.println("我是小老虎...");
    }
}

运行结果:
我是小老虎...
// 继承但不重写的 ExtendsAnimalNotReWrite.java
public class ExtendsAnimalNotReWrite extends Animal{
    public static void main(String[] args){
        ExtendsAnimalNotReWrite extendsAnimalNotReWrite = new ExtendsAnimalNotReWrite();
        extendsAnimalNotReWrite.whatAnimal();
    }
}
运行结果:
我是小猫...
三、this,this(),super,super()的使用
  • this引用对象自身,也可以在构造方法内部用于同一个类的其他构造方法,this在引用隐藏数据域以及调用一个重载的构造方法时时必须的。常常用在JavaBean 的setter和getter方法中
    this
  • super 指代父类可以用于调用父类的普通方法和构造方法
  • 父类的构造方法不能被子类继承,需要使用super 从子类的构造方法中调用[super()调用父类无参构造方法,super(args) 调用参数匹配的父类构造方法];注意必须出现在子类构造方法的第一条语句
    下面改造一下前面的Animall类,增加构造方法
    示例代码:
 // 基类 Animal.java
public class Animal {
    //该类的普通方法
    public void whatAnimal(){
        System.out.println("我是小猫...");
    }

    // 该类的无参构造方法
    public Animal(){
        System.out.println("我是Animal的无参构造方法");
    }
    // 该类的一个有参构造方法
    public Animal(String name){
        System.out.println("我是Animal的有参构造方法,我叫:" + name);
    }
}

// 继承自 Animal的类
public class ExtendsAnimal extends Animal {
    public static void main (String[] args){
        ExtendsAnimal extendsAnimal = new ExtendsAnimal();      // 会调用父类的无参构造方法,在创建对象时先执行父类的构造方法
        extendsAnimal.whatAnimal();     // 调用的是重写后的方法

        ExtendsAnimal extendsAnimal2 = new ExtendsAnimal("小蓝");

    }

    // 重写  加上注解 @Override
    @Override
    public void whatAnimal(){
        System.out.println("我是小老虎...");
    }

    // 构造方法 使用 super
    public ExtendsAnimal(){
        super();
    }

    public ExtendsAnimal(String name){
        super(name);        // 调用父类的 有参构造方法
    }
}

运行结果:
我是Animal的无参构造方法
我是小老虎...
我是Animal的有参构造方法,我叫:小蓝
  • 25
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值