一、super关键字

1.1 定义

  • super表示父类对象的引用
  • 可以调用父类中非私有的成员属性和成员方法
    • 调用属性

      • super.属性名
    • 调用方法
      • super.方法名(参数列表)
    • 调用构造方法
      • super(参数列表)
      • 只能放在子类构造器的第一行

1.2 案例

package com.qf.super0;public class Demo01 {public static void main(String[] args) {Tiger tiger = new Tiger();tiger.show();tiger.sleep();Tiger tiger2 = new Tiger("泰格", "爪哇虎");tiger2.show();}}class Animal{String type = "动物";String name;private int age = 2;public Animal() {super();}public Animal(String type, String name) {super();this.type = type;this.name = name;}public void eat(String food) {System.out.println("动物喜欢吃" + food);}public void sleep() {System.out.println("动物睡觉时为了修复细胞");}
}class Tiger extends Animal{String type = "老虎";String addr;public Tiger() {}public Tiger(String type, String name) {super(type, name);}public Tiger(String type,String name,String addr) {super(type, name);this.addr = addr;}public void show() {System.out.println(type + "是一种" + super.type);System.out.println(super.getClass());}@Overridepublic void sleep() {super.sleep();System.out.println("老虎睡觉有的时候是为了麻痹对方,准备干掉对象");}
}

1.3 this和super比较

  • 表示内容

    • this表示当前对象的引用
    • super表示父类对象的引用
  • 调用内容
    • this调用当前类的成员属性、成员方法、构造方法
    • super调用父类的成员属性、成员方法、构造方法
  • 都要放在构造器的第一行

二、子类对象创建的过程

2.1 定义

  • 子类对象内容的组成

    • 子类的属性+父类的非私有属性+子类的方法+父类非私有的方法

2.2 子类对象创建过程分析

三、多态

3.1 定义

  • 生活中的多态

    • 事物的多种表现形态
    • 比如一个人可以使员工、儿子、孙子、父亲、爷爷、丈夫、宝宝
  • 程序中的多态

    • 声明的数据类型是父类
    • 创建的对象类型是子类
    • 通过赋值符号,把引用给父类类型的变量
  • 多态中的情况

    • 子类和父类中的内容完全一样–子类只是单纯的继承了父类,没有自己独特的属性和方法

      • 子类重写了所有的属性和方法

        • 父类的所有属性和方法被覆盖
      • 子类重写了部分父类的内容
        • 父类被重写的内容被覆盖了,以子类重写的为准
        • 没有重写的部分依旧是父类自己原本的内容
      • 子类没有重写任何父类的属性和方法
        • 调用的时候还是父类原原本本的内容
    • 子类继承了父类之后,自己又产生了独特的属性和方法
      • 子类的属性和方法与父类类型的对象无关
      • 其他的参考上面的内容

3.2 多态案例

3.2.1 Human和Man和Woman

package com.qf.polymorphic;public class Demo01 {public static void main(String[] args) {// 正常创建对象Human human = new Human();human.sing();System.out.println("==============================");// 使用多态的方式创建对象Human man = new Man();// 调用方法,得到的是重写之后的结果man.sing();System.out.println(man.getClass().getName());}
}class Human{String name;int age;public void sing() {System.out.println("人开心的时候可以通过歌声表达心情");}
}class Man extends Human{String addr;@Overridepublic void sing() {System.out.println("男人开心的时候唱好汉歌");}public void sleep() {}}class Woman extends Human{@Overridepublic void sing() {super.sing();System.out.println("女人开心的时候唱学猫叫");}}

3.2.2 People和Male和Female

package com.qf.polymorphic;public class Demo02 {public static void main(String[] args) {People people = new People();dance(people);People male = new Male();dance(male);People female = new Female();dance(female);}/*** dance方法,需要传入People类型的变量* 在方法中调用people的dance方法* @param people*/public static void dance(People people) {people.dance();}
}class People{public void dance() {System.out.println("人开心的时候会跳舞");}
}class Male extends People{@Overridepublic void dance() {System.out.println("男人开心的时候跳街舞");}
}class Female extends People{@Overridepublic void dance() {System.out.println("女人开心的时候跳民族舞");}
}

3.4 多态的两种使用场景

3.4.1 作为形参

  • 形参声明为父类类型,可以接受参数的范围变得广泛
package com.qf.poly;public class Demo01 {public static void main(String[] args) {Person p = new Person();work(p);Person p1 = new Man();work(p1);Person p2 = new Woman();work(p2);}/***     声明的是父类类型的形参,可以传入此类型和他的子类类型* @param person*/public static void work(Person person) {person.work();}
}class Person{public void work() {System.out.println("人需要工作");}
}class Man extends Person{@Overridepublic void work() {System.out.println("为了自我价值的实现");}
}class Woman extends Person{@Overridepublic void work() {System.out.println("工作为了生存");}
}

3.4.2 作为返回值类型

  • 返回值类型声明为父类,可以返回此类型和其子类型的任意结果
package com.qf.poly;public class Demo02 {public static void main(String[] args) {Object obj = getObj("hahaha");System.out.println(obj);System.out.println(obj.getClass().getName());}public static Object getObj(Object obj) {return "任意类型的结果";}
}

四、向上转型和向下转型

4.1 向上转型

  • 声明父类类型的引用,创建子类类型的对象
  • 父类引用指向子类对象
  • 这个是多态的经典实用

4.2 向下转型

  • 把父类类型的对象通过强制转换的方式变成子类类型的引用
  • 需要强制转换
  • 可能会造成异常

4.3 instanceof

  • 判断一个对象是否是一个类(父类、祖父类、、、)的实例对象

4.4 案例

package com.qf.poly;public class Demo03 {public static void main(String[] args) {// 典型的多态的使用,也是我们以后使用的最多的方式Animal a = new Dog();a.eat();// 典型的向下转型,可以使用子类自己独有的属性和方法Dog dog = (Dog) a;dog.play();// 类型转换异常,语法上是没有问题的,但是运行的时候会报错// Cat cat = (Cat)a;String str = "abc";System.out.println(str instanceof String);System.out.println(a instanceof Animal);System.out.println(a instanceof Dog);System.out.println(a instanceof Cat);}
}class Animal{public void eat() {System.out.println("动物需要吃饭维持生命活动");}
}class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗狗喜欢吃骨头");}public void play() {System.out.println("狗子可以陪着主人玩飞碟");}
}class Cat extends Animal{}

五、static

5.1 定义

  • java中的关键字,表示静态
  • 可以修饰内部类、属性、方法、代码块

5.2 使用

  • static修饰变量

    • 变量的位置存放在方法区
    • 被所有此类的实例对象共享,如果一个对象修改了这个数据,其他对象获取到的是修改之后的内容
    • 调用的时候推荐使用 类.静态变量 的方式调用

5.3 案例

package com.qf.static0;public class Demo02 {static int num01 = 10;public static void main(String[] args) {// 局部变量numint num = 10;System.out.println(num);// 调用方法,传入举局部变量numchangeNum(num);System.out.println(num);// 调用方法,传入静态变量num01changeNum(num01);System.out.println(num01);// 调用方法,在方法中修改num01changeNum();System.out.println(num01);}private static void changeNum() {num01 = num01 + 10;}private static void changeNum(int num) {num = num + 10;}}
package com.qf.static0;public class Demo03 {public static void main(String[] args) {Person p = new Person();System.out.println(Person.capital);System.out.println(p.nation);p.nation = "大和民族";p.capital = "首尔";System.out.println(p.nation);System.out.println("=============");Person p2 = new Person();System.out.println(p2.nation);System.out.println(p2.capital);}
}class Person{String name;int age;static String capital = "汉城";String nation = "朝鲜族";
}

六、今日总结

  • 1、super(掌握)

    • 表示啥
    • 能干啥
    • 和this的区别
  • 2、子类对象创建的过程(掌握)

    • 自己会画出子类对象创建的内存图内存图
  • 3、多态(掌握)

    • 多态是啥
    • 怎么用
  • 4、转型(掌握)

    • 向上转型
    • 向下转型
  • 5、static(掌握)

super关键字,多态相关推荐

  1. Java复习题1(1.写出抽象类和接口的区别。2.This和Super关键字的区别有哪些?3.常见的类集子类有哪些,各有什么特点?4.什么是多态,多态实现的前提是什么?)

    1.写出抽象类和接口的区别. 答: 抽象类中的方法不全是抽象方法,可以在抽象类中声明并实现其他方法. 接口不允许方法的实现,定义的方法无方法体. 抽象类中的成员变量可以使用不同修饰符修饰,如publi ...

  2. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

  3. super关键字、static关键字、多态

    super关键字: 是java里面一个引用变量,用于直接引用父类对象,每当创建子类的实例时,父类的实例被隐式隐藏,这个时候可以用super关键字来调用. 用法如下: 1 super可以用来引用直接父类 ...

  4. Java---面向对象编程三大特征【封装、继承、多态】及super关键字、方法重写/覆盖(不定期更新补充)---B站韩顺平老师视频总结

    文章目录 三大特征 面向对象编程-封装 封装介绍 封装的理解和好处 封装的实现步骤(三步) 封装的简单案例 封装与构造器 封装的练习 面向对象编程-继承 为什么需要继承 继承基本介绍和示意图 继承的基 ...

  5. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  6. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  7. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

  8. 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类

    这篇博客将会涉及到: 继承的概念和实现 super关键字 方法重写-Override Object常见方法 继承的概念: 生活中,继承的概念随处可见,继承需要符合的关系:is-a:父类更通用.子类更特 ...

  9. JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态

    一.认识class定义类 我们会发现,按照前面的构造函数形式创建 类,不仅仅和编写普通的函数过于相似,而且代码并不容易理解. 在ES6(ECMAScript2015)新的标准中使用了class关键字来 ...

最新文章

  1. 点击form 表单中的button导致页面刷新问题
  2. ssh,scp带密码操作
  3. python能制作游戏吗_没有Python不能做的游戏,这些游戏都可以做
  4. mysql 取模分区_MySQL分区
  5. 百度和腾讯之间就差一个好的投资团队
  6. 首页大广告 redis缓存
  7. 编写Spark SQL查询程序
  8. Origin打断图像的y坐标和在柱状图上显示数字
  9. 采用C语言写文本文件实例
  10. 网易云音乐接口大全(亲测可用)
  11. 1 遥感图像处理之存储格式BSQ/BIL/BIP
  12. [转|会计学习]资产盘盈、盘亏的会计处理
  13. MindManager2020永久激活版如何绘制思维导图
  14. canvas——绘制图片——动图制作
  15. 根据当前时间获取当前周的周一到周日的日期
  16. 用python自动绘制小猪佩奇
  17. PMP-项目整合管理的内容
  18. PAT甲级真题1122 哈密顿回路(详解)
  19. spring tool suit 安装 Lombok 步骤
  20. PeckShield宣布与Cobo钱包达成安全战略合作

热门文章

  1. Carbon 一个在线代码美图生成工具
  2. vs code中pylint报错E1101问题的解决
  3. linux 内核 cpio,Linux 2.6内核cpio initrd释放资源的处理
  4. vbnet 产生 uniqueidentifier类型数据
  5. 中文分词工具使用方法及比较
  6. 人脸检测之Improved Faster R-CNN
  7. windows 计算机 快捷键,Windows10系统计算器快捷键是什么?
  8. 控制结构:13.个人所得税计算
  9. element-ui switch开关打开和关闭时的文字设置样式
  10. Unity ShaderLab特效教程 适用于贴图、sprite和ugui的2d着色器实例 代码+详解注释 【锐化效果】