类的继承

创建子类语法:

    修饰符 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面向对象类的继承~ 匿名类 ;多态特性;强制类型转换的更多相关文章

  1. Java 内部类,成员类,局部类,匿名类等

    根据内部类的位置不同,可将内部类分为 :成员内部类与局部内部类. class outer{ class inner{//成员内部类 } public void method() { class loc ...

  2. java多线程(一)之继承Thread类

    一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...

  3. Java面向对象封装和继承

    面向对象 什么是面向过程.面向对象? 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...

  4. java面向对象3-继承(继承、抽象类、抽象接口)

    4.继承 面向对象概念-类与对象的关系 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private-构造方法/构造器-this关键字-static关键字(javadoc制作工具类) -代 ...

  5. “全栈2019”Java第九十一章:内部类具有多态特性吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  7. Java面向对象(Eclipse高级、类与接口作为参数返回值)

      面向对象 今日内容介绍 u Eclipse常用快捷键操作 u Eclipse文档注释导出帮助文档 u Eclipse项目的jar包导出与使用jar包 u 不同修饰符混合使用细节 u 辨析何时定义变 ...

  8. java 面向对象(一):类与对象

    1.面向对象学习的三条主线: * 1.Java类及类的成员:属性.方法.构造器:代码块.内部类 * * 2.面向对象的大特征:封装性.继承性.多态性.(抽象性) * * 3.其它关键字:this.su ...

  9. Java中是否可以继承String类,为什么

    Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...

随机推荐

  1. Python+selenium之弹窗

  2. setoolkit的钓鱼实验

    1.在kali中打开setoolkit 2.在菜单中选择第一个进入社会工程学攻击 3.选择第二个模块属于网站攻击向量 4.选择第五个模块,进行web劫持攻击 5.选择第二个,进行网站克隆 6.发现访问 ...

  3. Sentry 监控 - Snuba 数据中台本地开发环境配置实战

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  4. 【POJ3614 Sunscreen】【贪心】

    题面: 有c头牛,需要的亮度在[min_ci,max_ci]中,有n种药,每种m瓶,可以使亮度变为v 问最多能满足多少头牛 算法 我们自然考虑贪心,我们首先对每头牛的min进行排序,然后对于每种药,将 ...

  5. Codeforces 1368E - Ski Accidents(构造+思维)

    Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...

  6. WPS for Linux 字体配置(字体缺失解决办法)

    WPS for Linux 字体配置(字体缺失解决办法) 1. 背景 有些linux装完wps后提示"部分字体无法显示"或"some formula symbols mi ...

  7. fluidity install on Cluster

    fluidity install on Cluster 1.编译器安装 gcc4.6 openmpi python HOME_PATH= /hpcdata1/xiaozhong/ 1.1.gmp &a ...

  8. 解决Package is not available (for R version XXX)?

    目录 1. 更新R(不推荐) 2. 更改或指定镜像源 3.源码安装 安装R包时这个错误是经常见到的.我认为有几个方法可解决,记录之. 1. 更新R(不推荐) 简单粗暴的方法就是更新R,但这波及的范围太 ...

  9. jquery操作html中图片宽高自适应

    在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...

  10. OC-私有方法,构造方法,类的本质及启动过程

    总结 标号 主题 内容 一 OC的私有方法 私有变量/私有方法 二 @property 概念/基本使用/寻找方法的过程/查找顺序 三 @synthesize @synthesize概念/基本使用/注意 ...