首页 > 编程语言 >JAVA继承得深度了解

JAVA继承得深度了解

时间:2022-12-22 14:36:30浏览次数:35  
标签:JAVA show 继承 Value public Person Student 深度 eat

继承与合成基本概念

继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。

合成:在新类里创建原有的对象称为合成。这种方式可以重复利用现有的代码而不更改它的形式。

1.继承的语法

关键字extends表明新类派生于一个已经存在的类。已存在的类称为父类或基类,新类称为子类或派生类。例如:

class Student extends Person {

}

类Student继承了Person,Person类称为父类或基类,Student类称为子类或派生类。

2.合成的语法

合成比较简单,就是在一个类中创建一个已经存在的类。

class Student {
    Dog dog;
}

 

上溯造型

1.基本概念

继承的作用在于代码的复用。由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类。如果Person类中有一个eat方法,那么Student类中也会有这个方法,这意味着Student对象也是Person的一种类型。

复制代码
class Person {
    public void eat() {
        System.out.println("eat");
    }

    static void show(Person p) {
        p.eat();
    }
}
public class Student extends Person{
    public static void main(String[] args) {
        Student s = new Student();
        Person.show(s);     // ①
    }
}
复制代码

 

【运行结果】:
eat

在Person中定义的show方法是用来接收Person句柄的,但是在①处接收的却是Student对象的引用。这是因为Student对象也是Person对象。在show方法中,传入的句柄(对象的引用)可以是Person对象以及Person的衍生类对象。这种将Student句柄转换成Person句柄的行为成为上溯造型

2.为什么要上溯造型

为什么在调用eat是要有意忽略调用它的对象类型呢?如果让show方法简单地获取Student句柄似乎更加直观易懂,但是那样会使衍生自Person类的每一个新类都要实现专属自己的show方法:

复制代码
class Value {
    private int count = 1;

    private Value(int count) {
        this.count = count;
    }

    public static final Value
            v1 = new Value(1),
            v2 = new Value(2),
            v3 = new Value(3);
}

class Person {

    public void eat(Value v) {
        System.out.println("Person.eat()");
    }
}

class Teacher extends Person {
    public void eat(Value v) {
        System.out.println("Teacher.eat()");
    }
}

class Student extends Person {
    public void eat(Value v) {
        System.out.println("Student.eat()");
    }
}

public class UpcastingDemo {
    public static void show(Student s) {
        s.eat(Value.v1);
    }

    public static void show(Teacher t) {
        t.eat(Value.v1);
    }

    public static void show(Person p) {
        p.eat(Value.v1);
    }

    public static void main(String[] args) {
        Student s = new Student();
        Teacher t = new Teacher();
        Person p = new Person();
        show(s);
        show(t);
        show(p);
    }
}
复制代码

这种做法一个很明显的缺陷就是必须为每一个Person类的衍生类定义与之紧密相关的方法,产生了很多重复的代码。另一方面,对于如果忘记了方法的重载也不会报错。上例中的三个show方法完全可以合并为一个:

public static void show(Person p) {
     p.eat(Value.v1);
}

 

标签:JAVA,show,继承,Value,public,Person,Student,深度,eat
From: https://www.cnblogs.com/pengsuoqun123/p/16998589.html

相关文章

  • 教你用JavaScript获取大转盘
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个大转盘。当你难以抉择的时候不妨用这个案例来帮你做选择。通过编......
  • 基础教程-类和对象-继承
    创建类和对象class关键字classA:a=4#实例化对象myA=A()print(myA.a)init()函数所有类都有一个_init_()函数,在启动类的时候执行,使用init()函数将值......
  • JAVA获取月份开始和月末最后一天
    packagecom.swift.oa;importjava.text.SimpleDateFormat;importjava.util.Calendar;publicclassAPP4{publicstaticvoidmain(String[]args){......
  • CentOS全局配置JAVA环境变量,实现多个tomcat共用环境变量,不用再一个个tomcat配置
     vim/etc/profile然后在最后加入下面的代码:export JAVA_HOME=/usr/local/java/jdkexport PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/ro......
  • JavaScript的Array一些非常规玩法
    [{name:1},{name:2}].forEach((v,i,ar)=>{console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v)=>v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变......
  • java实现字符串的翻转功能
    方法一/***使用StringBuilder自带函数reverse()实现翻转*/publicstaticStringstrReverse(Stringstr){StringBuilderstrResult=new......
  • java 位运算 取反(代码库)
    System.out.println(5&(~1)); 比如,通过二进制位运算实现权限设置newAuth.getAuthority()为表示权限的数字,attEnum.getIndex()指的是某一个权限的位数,代码如下 if......
  • Java架构师-学习路线
    1、基本功    2、审美观    3、分布式微服务企业级解决方案   4、分布式微服务与高并发   5、微服务容器化自动构建及部署实践  6......
  • Java编程思想1
    第一章:对象导论  这一章主要是帮助我们了解面向对象程序设计的全貌,更多是介绍的背景性和补充性的材料。其实萌新应该跳过这一章,因为这章并不会去讲语法相关的知识,当然可......
  • Java编程思想2
    第四章:控制执行流程  本章介绍了大多数编程语言都具有的基本特性:运算、操作符优先级、类型以及选择和循环等。例如布尔表达式、循环如while、do-While、for、分支判断如i......