06-多态

4.9 多态

  • 定义:某一类事物的多种存在形态。
  • 概念:多态的概念 父类引用指向子类对象 而实际调用的方法为子类的方法。

  • 例:动物中猫,狗。

  • 猫这个对象对应的类型是猫类型 
     猫 x = new 猫();
  • 同时猫也是动物中的一种,也可以把猫称为动物。 
     动物 y = new 猫(); 
     动物是猫和狗具体事物中抽取出来的父类型。 
     父类型引用指向了子类对象。

体现:父类或者接口的引用指向或者接收自己的子类对象。 
作用:多态的存在提高了程序的扩展性和后期可维护性 
前提: 
 1.要有继承或者实现。 
 2.要有覆盖(重写)操作

多态的好处: 
  提高了代码的扩展性,前期定义的代码可以使用后期的内容(子类重写了父类的方法,调用子类的内容)。 
多态的弊端: 
  前期定义的内容不能使用(调用)后期子类的特有内容(子类后来新添加的特性而父类原来没有的)。

4.9.1多态的特点

对于成员函数: 
 编译时:参考引用型变量所在的类中是否有调用的函数,有 编译通过, 没有 编译失败 
 运行时:参考对象所在的类中是否有调用的函数,有 运行成功,没有 运行失败

 口诀:编译看左边,运行看右边

对于成员变量: 
 编译时:参考引用型变量所在的类中是否有调用的成员变量,有 编译通过, 没有 编译失败 
 运行时:参考引用型变量所在的类中是否有调用的成员变量,有 编译通过, 没有 编译失败

 口诀:编译运行都看左边

5内部类

定义:一个类定义在另一个类的里面,在里面的类称为内部类(内置类,嵌套类)。 
访问特点: 
  内部类可以直接访问外部类中的成员,包括私有成员。 
  而外部类要访问内部类中的成员必须要建立内部类的对象。

5.0.1内部类的位置:

内部类定义在成员位置上 
 可以被private static成员修饰符修饰。 
 被static修饰的内部类只能访问外部类中的静态成员。

内部类定义在局部位置上 
 也可以直接访问外部类中的成员。 
 同时可以访问所在局部中的局部变量,但必须是被final修饰的(jdk8的新特性已经解决,jdk7以下还是需要final修饰)

tip:因为(包含内部类的)方法出栈时,里面的成员变量会被释放,而此时有引用指向方法中的内部类对象时,对象还是存在堆中,但是要访问的变量会找不到,会出现错误,总得来说就是方法和对象的生命周期不同。

5.1匿名内部类

就是内部类的简化写法。

前提: 
 内部类可以继承或实现一个外部类或者接口。 
格式为: 
 new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}

 
 
  1. //new 外部类名(){ 重写类的代码和自定义代码 };
  2. abstract class Fu{
  3. abstract void show();
  4. }
  5. class OutClass{
  6. void method(){
  7. new Fu(){
  8. void show(){
  9. System.out.println("匿名内部类");
  10. }
  11. };
  12. }
  13. }

简单理解: 
 就是建立一个建立一个带内容的外部类或者接口的子类匿名对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 本讲授将介绍继承与多态的概念及应用。我们将分别以Person、Student、Employee和Company为例,讲解如何使用继承和多态来实现面向对象的编程。通过本课程的学习,你将深刻理解继承与多态的内涵和意义,并能够熟练地运用它们来设计强大的面向对象程序。 ### 回答2: 本题目是一道面向对象的综合练习题目,主要涉及到Java中的继承、覆盖等概念。在这道题目中,我们需要实现一个Person类,并且从Person类派生出Student类和Employee类,再从Employee类派生出一个Company类。我们需要重载和覆盖Person、Student、Employee这三个类的方法,并且在Company类中创建Employee的对象,并且调用其方法。下面,我将从每一个类的定义及实现、方法的重载和覆盖以及Company类中的使用等方面详细解答这道题目。 首先,我们需要定义Person类。Person类中包含一个int类型的id、一个String类型的name和一个int类型的age。我们需要为Person类实现构造函数、getters和setters方法以及打印自身信息的方法show信息。具体实现如下: ``` public class Person { private int id; private String name; private int age; public Person() {} public Person(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println("id: " + id + ", name: " + name + ", age: " + age); } } ``` 接着,我们需要定义Student类和Employee类。两个类的定义很简单,只需要加上特有的属性即可,如Student类需要包含一个int类型的grade和一个String类型的major,而Employee类需要包含一个double类型的salary。除此之外,我们需要在这两个类中重载并覆盖Person类中的show()方法。 具体实现如下: ``` public class Student extends Person { private int grade; private String major; public Student(int id, String name, int age, int grade, String major) { super(id, name, age); this.grade = grade; this.major = major; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } @Override public void show() { System.out.println("I am a student. " + super.getName() + ", " + getAge() + " years old, major in " + major + ", grade " + grade + "."); } } public class Employee extends Person { private double salary; public Employee(int id, String name, int age, double salary) { super(id, name, age); this.salary = salary; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public void show() { System.out.println("I am an employee. " + super.getName() + ", " + getAge() + " years old, salary " + salary + "."); } } ``` 最后,我们需要定义Company类,这个类需要创建一个Employee的对象,并且调用其show()方法。由于Employee类是Person类的子类,因此我们可以使用Person类的实例变量来引用Employee的对象。具体实现如下: ``` public class Company { public static void main(String[] args) { Employee employee = new Employee(1001, "张三", 28, 10000.0); employee.show(); } } ``` 以上就是本题目的完整解答。通过这道题目,我们学会了Java中继承、覆盖等面向对象的编程技巧,这些技巧在实际的开发中非常重要。希望大家能够善加利用,写出更加高效、健壮的Java程序。 ### 回答3: 本题是继承覆盖综合练习,需要定义Person(人),Student(学生),Employee(雇员)和Company(公司)类。在这些类中,Person是基类,Student和Employee继承自Person,Company类嵌套包含多个Employee实例。 在Person类中,有两个数据成员name和age,分别表示人的姓名和年龄。在该类中,有一个构造函数用于初始化这两个数据成员。 在Student类中,除了继承Person类中的数据成员name和age之外,还有一个数据成员id和一个函数成员toString。id表示学生的学号,toString是一个重写(override)Person类中的函数成员,用于打印学生的信息,即姓名、年龄和学号。 在Employee类中,继承了Person类中的数据成员name和age,另外还有一个数据成员salary,表示雇员的工资,和一个函数成员toString,用于打印雇员的信息,即姓名、年龄和工资。 在Company类中,嵌套包含多个Employee实例,可以实现添加、删除和打印这些Employee的信息。另外,还有一个函数成员averageSalary,用于计算该公司的平均工资。 总体来说,本题主要考察对继承、覆盖以及嵌套类的基本理解和运用。需要注意的是,在重写函数成员时,需要使用@Override注解来标记该函数成员是一个重写函数成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值