java面向对象类的继承~ 匿名类 ;多态特性;强制类型转换
类的继承
创建子类语法:
修饰符 class 子类名 extends 父类名{
}
匿名子类语法:
直接实例化,过程中通过匿名类 继承父类,在实例化过程中将子类匿名
<父类类名> 实例名 = new 父类名() {
匿名类代码逻辑....
}
自定义类默认继承了Object类:
自定义类默认隐藏式继承了Object类
class Cat {
...
}
等价于如下
class Cat extends Object{
.........
}
类的继承特性:
1、没指定继承哪个父类,默认继承Object
2、在Java中Object类是所有类的父类
3、子类继承父类时,不能继承父类的构造方法【这一点不如Python】
4、父类叫做基类,子类叫做派生类
5、满足条件is a
6、一个类只能继承一个直接父类
7、类继承具有传递性。
理解视图举例

代码举例:水果~苹果
父类:水果
package com.zmd.study.exten;
public class Fruit {
/**
* 水果的重量属性
*/
private double weight ;
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
子类:苹果类
package com.zmd.study.exten;
public class Apple extends Fruit{
public String color ;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
测试类输出:
public class Test {
public static void main(String[] args) {
Apple apple = new Apple();
apple.setWeight(0.3);
System.out.println("苹果重量:" + apple.getWeight());
}
}
/**
输出:
苹果重量:0.3
*/
重写父类方法
---子类的方法名、参数列表、修饰符一致
---子类的返回类型一致或父类方法返回类型的子类型:
例如:String 是Object的子类型
int 是 Double的子类型
super
注意事项:
1、super.方法/变量。直接访问父类的资源
2、如果不写,默认为访问本类中资源即隐含了this.
3、如果子类重写父类的方法体中,有调用被重写的方法,则只能使用super
4、访问父类中的实例变量可以是this. 也可以是super. 但是范围子类独有的实例变量/方法 只能用this
5、super(); super([参数列表])完成对父类构造方法赋值
重写的方法无返回值测试
水果父类
package com.zmd.study.exten; /**
* @ClassName Fruit
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/28.
*/
public class Fruit {
/**
* 水果的重量属性
*/
private double weight ; public double getWeight() {
return weight;
} public void setWeight(double weight) {
this.weight = weight;
}
public void showInfo(){
//被子类重写的方法
System.out.println("我是水果,我的重量是:" + weight );
}
}
子类
package com.zmd.study.exten; import java.sql.SQLOutput; /**
* @ClassName Apple
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/28.
*/
public class Apple extends Fruit{
public String color ; public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public void showInfo(){
//调用父类中的方法用super
super.showInfo();
System.out.println("我是苹果,我的重量是:" + this.getWeight());
}
}
测试类&执行效果
import com.zmd.study.exten.Apple;
public class Test {
public static void main(String[] args) {
Apple apple = new Apple();
apple.setWeight(0.2);
apple.showInfo();
}
}
/**
输出:
我是水果,我的重量是:0.2
我是苹果,我的重量是:0.2
*/
子类和父类的属性名相同
如果在子类中定义了与父类中同名的变量,那么子类中会隐藏父类的变量。但不是完全覆盖。在子类初始化的时候依然会为父类变量分配内存空间。通过父类中public属性的方法仍然可以访问父类的对应属性。
如下示例:水果父类中名字 苹果类中名字重复
package com.zmd.study.exten;
public class Fruit {
/**
* 水果的重量属性
*/
private double weight ;
/**
* 名字
*/
private String name = "水果";
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void showInfo(){
//被子类重写的方法
System.out.println("我是"+ name +",我的重量是:" + weight );
}
}
苹果类
package com.zmd.study.exten; import java.sql.SQLOutput; /**
* @ClassName Apple
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/28.
*/
public class Apple extends Fruit{
public String name = "苹果";
public String color ; public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public void showInfo(){
//调用父类中的方法用super
super.showInfo();
System.out.println("我是"+ name +",我的重量是:" + this.getWeight());
}
}
测试类
public class Test {
public static void main(String[] args) {
Apple apple = new Apple();
apple.setWeight(0.2);
apple.showInfo();
}
}
输出:
我是水果,我的重量是:0.2
我是苹果,我的重量是:0.2
父类中含有构造方法
父类中只有一个有参构造。则子类构造方法必须给父类构造方法参数传值:
即有参构造方法会覆盖无参构造方法,当不存在无参构造方法不存在的时候,java自动会运行一个空的无参构造方法。
如果子类构造方法不想给父类调用父类有参构造:父类必须含有无参构造方法。
语法:
public 类名([参数列表]){
完成对子类成员变量赋值;
super(参数); //完成对父类构造方法赋值
}
水果(父)类举例
package com.zmd.study.exten; /**
* @ClassName Fruit
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/28.
*/
public class Fruit {
/**
* 水果的重量属性
*/
private double weight ; /**
* 名字
*/
private String name = "水果"; /**
* 父类无参构造方法
*/
public Fruit() {
} /**
* 父类有参构造方法
* @param weight
* @param name
*/
public Fruit(double weight, String name) {
this.weight = weight;
this.name = name;
}
public void showInfo(){
//被子类重写的方法
System.out.println("我是"+ name +",我的重量是:" + weight );
}
}
苹果类~子类
package com.zmd.study.exten; import java.sql.SQLOutput; /**
* @ClassName Apple
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/28.
*/
public class Apple extends Fruit{
public String name = "苹果";
public String color ; /**
* 子类无参构造
*/
public Apple() {
} /**
* 子类有参构造
* @param weight
* @param name
*/
public Apple(int weight, String name) {
super(weight,name);
}
}
对比说明

实例化子类过程中发生了什么?
1、子类名obj = new 子类();
2、执行了父类对应构造super()
如果不手动执行super(参数),而子类构造方法中直接执行对父类的成员变量赋值,则默认会执行super()父类无参构造一次
则:需注意,构造方法无参的无用也要写上避免出现错误
所有类的祖类(默认父类)都是Object
instanceof 判断前面的实例是不是后面类的实现
public class Test {
public static void main(String[] args) {
Apple apple = new Apple();
System.out.println(apple instanceof Object);
}
/**
输出:true
*/
多态特性
Javad 引用变量有两个类型,一个是编译时类型,一个是运行时类型。
编译时类型由声明该变量时使用的类型决定。
运行时类型由实际赋给该变量的对象决定,如果编译时类型和运行时类型不一致,就可能出现所谓的“多态”
通俗理解:用父类声明变量,用子类来实例化
语法:
父类类名 引用名称 = new 子类类名();
注意,引用名称.只能访问父类的实例属性和实例方法,如果子类重写了父类的方法,则优先访问子类的方法。
示例:动物类、 下属 猫类、狗类
package com.zmd.study.exten;
public class Animal {
public void say(){
System.out.println("本动物要叫了....");
}
}
package com.zmd.study.exten;
public class Dog extends Animal{
public void say(){
System.out.println("小狗汪汪汪~~~!!!");
}
}
package com.zmd.study.exten;
public class Cat extends Animal{
public void say(){
System.out.println("本小猫 喵喵喵~~~!!!");
}
}
测试类
//import org.omg.Messaging.SYNC_WITH_TRANSPORT; import com.zmd.study.exten.Animal;
import com.zmd.study.exten.Cat;
import com.zmd.study.exten.Dog; public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.say();
cat.say();
}
/**
小狗汪汪汪~~~!!!
本小猫 喵喵喵~~~!!!
*/
使用子类特有的方法报错:比如小狗比动物多了生气的方法
package com.zmd.study.exten;
public class Dog extends Animal{
public void say(){
System.out.println("小狗汪汪汪~~~!!!");
}
public void angry(){
System.out.println("小狗生气了~要咬人");
}
}
测试
import com.zmd.study.exten.Animal;
import com.zmd.study.exten.Cat;
import com.zmd.study.exten.Dog; public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
dog.angry();//这里直接报语法错误:找不到符号,因为父类中没有
}
强制类型转换
语法:子类类型 引用名称 = (子类类型) 父类对象
注意:需要保证当前运行时的对象,一定是我们要转换对象的实例或者子类的实例。
import com.zmd.study.exten.Animal;
import com.zmd.study.exten.Cat;
import com.zmd.study.exten.Dog; public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
Dog dog1 = (Dog)dog;
dog1.angry();
}
/**
小狗生气了~要咬人
*/
instanceOf 关键字
判断实例是不是后面类或者子类实例化的一个对象
语法:<引用类型的变量> instanceOf <类>
返回布尔值true/false
示例
System.out.println(dog instanceof Animal);
System.out.println(dog instanceof Cat);
/**
true
false
*/
java面向对象类的继承~ 匿名类 ;多态特性;强制类型转换的更多相关文章
- Java 内部类,成员类,局部类,匿名类等
根据内部类的位置不同,可将内部类分为 :成员内部类与局部内部类. class outer{ class inner{//成员内部类 } public void method() { class loc ...
- java多线程(一)之继承Thread类
一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...
- Java面向对象封装和继承
面向对象 什么是面向过程.面向对象? 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...
- java面向对象3-继承(继承、抽象类、抽象接口)
4.继承 面向对象概念-类与对象的关系 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private-构造方法/构造器-this关键字-static关键字(javadoc制作工具类) -代 ...
- “全栈2019”Java第九十一章:内部类具有多态特性吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Java面向对象(Eclipse高级、类与接口作为参数返回值)
面向对象 今日内容介绍 u Eclipse常用快捷键操作 u Eclipse文档注释导出帮助文档 u Eclipse项目的jar包导出与使用jar包 u 不同修饰符混合使用细节 u 辨析何时定义变 ...
- java 面向对象(一):类与对象
1.面向对象学习的三条主线: * 1.Java类及类的成员:属性.方法.构造器:代码块.内部类 * * 2.面向对象的大特征:封装性.继承性.多态性.(抽象性) * * 3.其它关键字:this.su ...
- Java中是否可以继承String类,为什么
Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...
随机推荐
- 如何找到mysql磁盘地址
show global variables like "%datadir%"; 我的位置: C:\ProgramData\MySQL\MySQL Server 5.5\Data\
- jenkins cron
1. Jenkins cron syntax Jenkins Cron 语法遵循Cron实用程序的语法(略有不同)具体来说,每行包含由TAB或SPACE分隔的5个字段(分时日月周): 分钟(Minut ...
- 小白秒懂的Windows下搭建基于pytorch的深度学习环境
配置环境总体思路 1.依据python版本选择对应Anaconda版本: 2.依据显卡驱动版本选择对应的CUDA版本: 3.依据CUDA版本选择对应的cudnn和pytorch版本. 一.Anacon ...
- Linux生信服务器磁盘如何挂载使用?
用过很多服务器,但一直没自己挂载过磁盘,因为待挂载的磁盘上都有数据,生怕一不小心把别人的弄坏了. 今天恰好有几块新的磁盘,供我尝试下. 首先查看下磁盘: $ df -h 文件系统 容量 已用 可用 已 ...
- SR4R数据库:水稻4个SNP集的筛选及其应用
目录 前言 四个SNP集 hapmapSNPs tagSNPs fixedSNPs barcodeSNPs hapmapSNPs的指标统计 tagSNPs的群体结构验证 tagSNPs的遗传多样性 t ...
- 【Pathview web】通路映射可视化
前言 pathview是一个通路可视化友好的R包,最主要的是它支持多组学数据映射(基因/蛋白-代谢).自己用过它的R包,后来发现有网页版的,果断介绍给学员.因为不常用,记录要点,以后温习备用. 目前w ...
- R语言与医学统计图形-【11】ggplot2几何对象之散点图
ggplot2绘图系统--几何对象之散点图 以geom开头的函数超过30个.几何对象和标度函数scale密不可分.只有在aes中传入某个变量,scale才能发挥作用. 所谓标度scale,就是图形遥控 ...
- 基于MS SQL Server的数据库学习安排
序号 分类 学习内容 目标/要求 方式 学时 考核 参考资料 1 基础知识 数据库理论 理解数据库基本理论 面授 1 能阐述元素.数据记录.数据表.数据库的基本概念T-SQL语法要求 https:// ...
- Python序列化,json&pickle&shelve模块
1. 序列化说明 序列化可将非字符串的数据类型的数据进行存档,如字典.列表甚至是函数等等 反序列化,将通过序列化保存的文件内容反序列化即可得到数据原本的样子,可直接使用 2. Python中常用的序列 ...
- C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件
Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...