super关键字,多态
一、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关键字,多态相关推荐
- Java复习题1(1.写出抽象类和接口的区别。2.This和Super关键字的区别有哪些?3.常见的类集子类有哪些,各有什么特点?4.什么是多态,多态实现的前提是什么?)
1.写出抽象类和接口的区别. 答: 抽象类中的方法不全是抽象方法,可以在抽象类中声明并实现其他方法. 接口不允许方法的实现,定义的方法无方法体. 抽象类中的成员变量可以使用不同修饰符修饰,如publi ...
- 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)
IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...
- super关键字、static关键字、多态
super关键字: 是java里面一个引用变量,用于直接引用父类对象,每当创建子类的实例时,父类的实例被隐式隐藏,这个时候可以用super关键字来调用. 用法如下: 1 super可以用来引用直接父类 ...
- Java---面向对象编程三大特征【封装、继承、多态】及super关键字、方法重写/覆盖(不定期更新补充)---B站韩顺平老师视频总结
文章目录 三大特征 面向对象编程-封装 封装介绍 封装的理解和好处 封装的实现步骤(三步) 封装的简单案例 封装与构造器 封装的练习 面向对象编程-继承 为什么需要继承 继承基本介绍和示意图 继承的基 ...
- Java面向对象之继承,方法重写,super关键字,员工类系列继承题
在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...
- Java基础super关键字、final关键字、static关键字、匿名对象整理
super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...
- Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式
一.继承的概念及用法 继承背后的思想就是 基于已存在的类来构建新类 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...
- 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
这篇博客将会涉及到: 继承的概念和实现 super关键字 方法重写-Override Object常见方法 继承的概念: 生活中,继承的概念随处可见,继承需要符合的关系:is-a:父类更通用.子类更特 ...
- JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态
一.认识class定义类 我们会发现,按照前面的构造函数形式创建 类,不仅仅和编写普通的函数过于相似,而且代码并不容易理解. 在ES6(ECMAScript2015)新的标准中使用了class关键字来 ...
最新文章
- 点击form 表单中的button导致页面刷新问题
- ssh,scp带密码操作
- python能制作游戏吗_没有Python不能做的游戏,这些游戏都可以做
- mysql 取模分区_MySQL分区
- 百度和腾讯之间就差一个好的投资团队
- 首页大广告 redis缓存
- 编写Spark SQL查询程序
- Origin打断图像的y坐标和在柱状图上显示数字
- 采用C语言写文本文件实例
- 网易云音乐接口大全(亲测可用)
- 1 遥感图像处理之存储格式BSQ/BIL/BIP
- [转|会计学习]资产盘盈、盘亏的会计处理
- MindManager2020永久激活版如何绘制思维导图
- canvas——绘制图片——动图制作
- 根据当前时间获取当前周的周一到周日的日期
- 用python自动绘制小猪佩奇
- PMP-项目整合管理的内容
- PAT甲级真题1122 哈密顿回路(详解)
- spring tool suit 安装 Lombok 步骤
- PeckShield宣布与Cobo钱包达成安全战略合作
热门文章
- Carbon 一个在线代码美图生成工具
- vs code中pylint报错E1101问题的解决
- linux 内核 cpio,Linux 2.6内核cpio initrd释放资源的处理
- vbnet 产生 uniqueidentifier类型数据
- 中文分词工具使用方法及比较
- 人脸检测之Improved Faster R-CNN
- windows 计算机 快捷键,Windows10系统计算器快捷键是什么?
- 控制结构:13.个人所得税计算
- element-ui switch开关打开和关闭时的文字设置样式
- Unity ShaderLab特效教程 适用于贴图、sprite和ugui的2d着色器实例 代码+详解注释 【锐化效果】