Java面向对象4

本文围绕Java面向对象编程展开,介绍了方法的重写,包括重写规则及好处;阐述了super和this关键字的作用,前者用于访问父类成员,后者指向自身;还说明了final修饰符对变量、方法和类的影响,如修饰类不能被继承等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java面向对象4

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:MyEclipse 10  Java

作者:陈剑波

撰写时间:2019年05月19日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1、方法的重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改 变。

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

方法的重写规则:

  1. 参数列表必须完全与被重写方法的相同;
  2. 返回类型必须完全与被重写方法的返回类型相同;
  3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方 法被声明为public,那么在子类中重写该方法就不能声明为protected。
  4. 父类的成员方法只能被它的子类重写。
  5. 声明为final的方法不能被重写。
  6. 声明为static的方法不能被重写,但是能够被再次声明。
  7. 子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final 的方法。
  8. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected的非final方法。
  9. 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是, 重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性 异常,反之则可以。
  10. 构造方法不能被重写。
  11. 如果不能继承一个方法,则不能重写这个方法。

 

示例代码:

public class Person2 {

    private int age;

    private String name;

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

   

    public String getInfo() {//方法

        return "姓名:" + name + ",年龄: " + age;

    }

 

}

 

public class Student extends Person2 {

    private String school;

 

    public String getSchool() {

        return school;

    }

 

    public void setSchool(String school) {

        this.school = school;

    }

 

    public String getInfo() {//重写父类的方法 (override)

        return "姓名:" + getName() + ",年龄:" + getAge() + ",学校:" + school;

    }

}

 

public class Test3 {

    public static void main(String[] args) {

        Person2 person = new Person2();

        person.setAge(22);

        person.setName("普罗利");

System.out.println(person.getInfo());

       

        Student student = new Student();

        student.setAge(23);

        student.setName("卡洛特");

        student.setSchool("哈佛大学");

        System.out.println(student.getInfo());

    }

}

 

运行结果:

姓名:普罗利,年龄: 22

姓名:卡洛特,年龄:23,学校:哈佛大学

 

2、super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对 象的父类。  

this关键字:指向自己的引用。

示例代码:

public class Bird {

    int weight=1;

    String name="小鸟";

    public void fly() {

        System.out.println("我会飞,你会吗?");

    }

}

 

public class Ostrich extends Bird {

    int weight = 20;

    String name = "鸵鸟";

    public void fly() {

        System.out.println("会飞了不起啊!!");

    }

 

    public void superThisDemo() {// super this 关键字

        //this,调用自身的成员变量

        System.out.println("体重:"+this.weight + ",姓名:" + this.name);

        //this,调用自身的方法

        this.fly();

       

        //super,子类中调用父类的成员变量

        System.out.println("体重:"+super.weight + ",姓名:" +super.name);

        //super,子类中调用父类的方法

        super.fly();

    }

}

 

public class Test3 {

    public static void main(String[] args) {

        Ostrich ostrich=new Ostrich();

        ostrich.fly();

        ostrich.superThisDemo();

    }

}

 

运行结果:

会飞了不起啊!!

体重:20,姓名:鸵鸟

会飞了不起啊!!

体重:1,姓名:小鸟

我会飞,你会吗?

 

 

3、final修饰符

final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

  1. fianl修饰类:修饰的类不能被继承
  2. fianl修饰方法:修饰的方法不能被重写
  3. fianl修饰变量:一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。

示例代码:

/**

 * @author KO.ZERO final修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法 被改变。

 *         对于成员变量来说,我们必须在声明时、构造方法或者初始化块中对它赋值;

 *

 */

public class FinalMemberVariables {// final修饰的实例变量

    // 声明实例变量并赋初始值

    final int age = 22;

    // 在初始化块中赋初始值

    final int age1;

    {

        age1 = 22;

    }

    // 在构造器中赋初始值

    final int age2;

 

    public FinalMemberVariables() {

        age2 = 22;

    }

 

    // final修饰类变量

    // 声明该类变量时指定初始值或在静态初始化块中指定初始值

    final static int age3 = 22;

    final static int age4;

    static {

        age4 = 22;

    }

}

/**

 * @author KO.ZERO

 *final修饰局部变量,表示在变量的生存期中它的值不能被改变

 */

public class FinalLocalVariable {//fianl修饰的局部变量

    public static void main(String[] args) {

        //在定义变量时指定初始值就不能在后面的代码中为变量赋值了

        final String name = "剑魔";

        //在定义变量时不指定初始值可以在后面的代码中为变量赋值一次

        final String name2;

        name2 = "剑神";

    }

    public void test(final int age){

        //不能对final修饰的形参赋值

//      age=22;

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值