• 体现了事物的多态性
  • 创建多态的方法:Fu f = new Zi()
  • 父类对象指向子类内存地址

多态访问成员方法的特点

1、编译看左,运行看右
2、编译的时候看=左边的类型中,是否定义了该方法,如果有就编译通过,如果没有就编译报错
3、运行的时候看=右边的类型中,对象所属的类中,如果对这个方法提供了新的实现,最终运行的就是子类对这个方法的实现,如果没有因为继承,所以使用父类的实现

注意:子类的特有成员方法是无法调用的

示例:

  1. package com.bxw.demo;
  2. import java.io.FileInputStream;
  3. public class Class多态 {
  4. public static void main(String[] args) {
  5. // 创建多态
  6. Fu fu = new Zi();
  7. // 创建了一个父类指向子类内存的多态
  8. // 子类中特有的方法和成员变量是无法被调用的。但是子类中没有重写父类中的方法时,多态对调
  9. // 会调用父类的成员方法。注意子类的特有成员方法是无法调用的
  10. fu.getFuAge();
  11. fu.getFuName();
  12. // fu.getZiId(); // 无法调用
  13. }
  14. }
  15. // 创建一个父类
  16. class Fu{
  17. private String name;
  18. private int age;
  19. public Fu() {
  20. }
  21. public Fu(String name, int age) {
  22. this.name = name;
  23. this.age = age;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. // 创建一个获取name父类方法
  38. public void getFuName(){
  39. System.out.println("父类中方法");
  40. }
  41. // 创建一个获取age的父类方法
  42. public void getFuAge(){
  43. System.out.println("父类中的方法");
  44. }
  45. }
  46. // 创建一个子类
  47. class Zi extends Fu{
  48. private int id;
  49. public Zi() {
  50. }
  51. public Zi(String name, int age, int id) {
  52. super(name, age);
  53. this.id = id;
  54. }
  55. public Zi(int id) {
  56. this.id = id;
  57. }
  58. public int getId() {
  59. return id;
  60. }
  61. public void setId(int id) {
  62. this.id = id;
  63. }
  64. // 重写父类中的方法
  65. @Override
  66. public void getFuAge() {
  67. System.out.println("重写了父类的getFuAge方法");
  68. }
  69. @Override
  70. public void getFuName() {
  71. System.out.println("重写了父类的getFuName方法");
  72. }
  73. // 创建一个子类特有的方法
  74. public void getZiId() {
  75. System.out.println("创建了一个子类特有的方法");
  76. }
  77. }

向上向下转型

  1. package com.bxw.demo;
  2. import java.io.FileInputStream;
  3. public class Class多态 {
  4. public static void main(String[] args) {
  5. // 多态的实现就是向上转型
  6. Fu fu = new Zi("jack",12,21);
  7. fu.getFuAge();
  8. fu.getFuName();
  9. // 向下转型
  10. Zi zi = (Zi)fu;
  11. // 向下转型之后可以调用子类的特有方法了
  12. zi.getZiId();
  13. System.out.println("name:" + zi.getName() + " age:" + zi.getAge() + " id:" + zi.getId());
  14. }
  15. }
  16. // 创建一个父类
  17. class Fu{
  18. private String name;
  19. private int age;
  20. public Fu() {
  21. }
  22. public Fu(String name, int age) {
  23. this.name = name;
  24. this.age = age;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public int getAge() {
  33. return age;
  34. }
  35. public void setAge(int age) {
  36. this.age = age;
  37. }
  38. // 创建一个获取name父类方法
  39. public void getFuName(){
  40. System.out.println("父类中方法");
  41. }
  42. // 创建一个获取age的父类方法
  43. public void getFuAge(){
  44. System.out.println("父类中的方法");
  45. }
  46. }
  47. // 创建一个子类
  48. class Zi extends Fu{
  49. private int id;
  50. public Zi() {
  51. }
  52. public Zi(String name, int age, int id) {
  53. super(name, age);
  54. this.id = id;
  55. }
  56. public Zi(int id) {
  57. this.id = id;
  58. }
  59. public int getId() {
  60. return id;
  61. }
  62. public void setId(int id) {
  63. this.id = id;
  64. }
  65. // 重写父类中的方法
  66. @Override
  67. public void getFuAge() {
  68. System.out.println("重写了父类的getFuAge方法");
  69. }
  70. @Override
  71. public void getFuName() {
  72. System.out.println("重写了父类的getFuName方法");
  73. }
  74. // 创建一个子类特有的方法
  75. public void getZiId() {
  76. System.out.println("创建了一个子类特有的方法");
  77. }
  78. }
  • 向上转型:多态的实现就是属于向上转型
  • 向下转型:必须是已经经过向上转型的才可以进行向下转型
  • 格式:Zi z = (Zi) f

示例:

instanceof

这个关键字用与判断多态instanceof指定的数据类型,返回值是一个布尔值

示例:

  1. package com.bxw.demo.demo07;
  2. import java.io.FileReader;
  3. public class instanceof判断 {
  4. public static void main(String[] args) {
  5. // 多态实现
  6. Fu fu = new Zi();
  7. Fu fu1 = new Fu();
  8. Zi zi1 = new Zi();
  9. // 使用instanceof关键字来判断fu是否之Zi类型
  10. System.out.println(fu instanceof Zi);// true 向上转型
  11. System.out.println(fu instanceof Fu);// true 对象关系
  12. System.out.println(fu1 instanceof Fu);// true 对象关系
  13. System.out.println(fu1 instanceof Zi);// false 反了
  14. System.out.println(zi1 instanceof Fu); // true 继承关系
  15. // instanceof的作用是能更准确的进行向下转型
  16. if (fu instanceof Zi == true){
  17. System.out.println("已向上转型");
  18. Zi zi = (Zi)fu;
  19. System.out.println("向下转型成功");
  20. }
  21. if (fu1 instanceof Zi == false){
  22. System.out.println("未向上转型");
  23. }
  24. }
  25. }
  26. // 父类
  27. class Fu{
  28. String name = "jack";
  29. public void printName(){
  30. System.out.println(this.name);
  31. }
  32. }
  33. // 子类
  34. class Zi extends Fu{
  35. int age = 18;
  36. public void printName_Age(){
  37. System.out.println(this.name + "--" + this.age);
  38. }
  39. }