首页 > 编程语言 >Java面向对象进阶(二)

Java面向对象进阶(二)

时间:2024-04-09 18:32:24浏览次数:28  
标签:调用 Java 进阶 子类 成员 多态 面向对象 父类 public

day02——面向对象高级

今天我们继续学习面向对象的语法知识,我们今天学习的主要内容是:继承,多态、抽象、接口。

学会这些语法知识,可以让我们编写代码更灵活,代码的复用性更高。

2.1 继承快速入门

各位同学,我们继续学习面向对象相关内容。面向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是因为它有三大特征,继承、封装和多态。封装我们在基础班已经学过了,接下来我们学习一下继承。
在这里插入图片描述
接下来,我们演示一下使用继承来编写代码,注意观察继承的特点。

public class A{
    //公开的成员
    public int i;
    public void print1(){
        System.out.println("===print1===");
    }
    
    //私有的成员
    private int j;
    private void print2(){
        System.out.println("===print2===");
    }
}

然后,写一个B类,让B类继承A类。在继承A类的同时,B类中新增一个方法print3

public class B extends A{
    public void print3(){
        //由于i和print1是属于父类A的公有成员,在子类中可以直接被使用
        System.out.println(i); //正确
        print1(); //正确
        
        //由于j和print2是属于父类A的私有成员,在子类中不可以被使用
        System.out.println(j); //错误
        print2(); //错误
    }
}

接下来,我们再演示一下,创建B类对象,能否调用父类A的成员。再写一个测试类

public class Test{
    public static void main(String[] args){
        B b = new B();
        //父类公有成员,子类对象是可以调用的
        System.out.println(i); //正确
        b.print1();
        
        //父类私有成员,子类对象时不可以调用的
        System.out.println(j); //错误
        b.print2(); //错误
    }
}

到这里,关于继承的基本使用我们就算学会了。为了让大家对继承有更深入的认识,我们来看看继承的内存原理。

这里我们只需要关注一点:子类对象实际上是由子、父类两张设计图共同创建出来的。

所以,在子类对象的空间中,既有本类的成员,也有父类的成员。但是子类只能调用父类公有的成员。
在这里插入图片描述

2.2 继承的好处

各位同学,学习完继承的快速入门之后,接下来我们学习一下继承的好处,以及它的应用场景。

我们通过一个案例来学习

在这里插入图片描述

观察代码发现,我们会发现Teacher类中和Consultant类中有相同的代码;其实像这种两个类中有相同代码时,没必要重复写。

我们可以把重复的代码提取出来,作为父类,然后让其他类继承父类就可以了,这样可以提高代码的复用性。改造后的代码如下:
在这里插入图片描述
关于继承的好处我们只需要记住:继承可以提高代码的复用性

2.3 权限修饰符

各位同学,在刚才使用继承编写的代码中我们有用到两个权限修饰符,一个是public(公有的)、一个是private(私有的),实际上还有两个权限修饰符,一个是protected(受保护的)、一个是缺省的(不写任何修饰符)。

接下来我们就学习一下这四个权限修饰符分别有什么作用。

什么是权限修饰符呢?

权限修饰符是用来限制类的成员(成员变量、成员方法、构造器…)能够被访问的范围。

每一种权限修饰符能够被访问的范围如下
在这里插入图片描述
下面我们用代码演示一下,在本类中可以访问到哪些权限修饰的方法。

public class Fu {
    // 1、私有:只能在本类中访问
    private void privateMethod(){
        System.out.println("==private==");
    }

    // 2、缺省:本类,同一个包下的类
    void method(){
        System.out.println("==缺省==");
    }

    // 3、protected: 本类,同一个包下的类,任意包下的子类
    protected void protectedMethod(){
        System.out.println("==protected==");
    }

    // 4、public: 本类,同一个包下的类,任意包下的子类,任意包下的任意类
    public void publicMethod(){
        System.out.println("==public==");
    }

    public void test(){
        //在本类中,所有权限都可以被访问到
        privateMethod(); //正确
        method(); //正确
        protectedMethod(); //正确
        publicMethod(); //正确
    }
}

2.4 单继承、Object

刚才我们写的代码中,都是一个子类继承一个父类,那么有同学问到,一个子类可以继承多个父类吗?

Java语言只支持单继承,不支持多继承,但是可以多层继承

2.5 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

注意:重写后,方法的访问遵循就近原则

  • 1.重写的方法上面,可以加一个注解@Override,用于标注这个方法是复写的父类方法
  • 2.子类复写父类方法时,访问权限必须大于或者等于父类方法的权限 public > protected > 缺省
    1. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
    1. 私有方法、静态方法不能被重写,如果重写会报错。

2.6 子类中访问成员的特点

各位同学,刚才我们已经学习了继承,我们发现继承至少涉及到两个类,而每一个类中都可能有各自的成员(成员变量、成员方法),就有可能出现子类和父类有相同成员的情况,那么在子类中访问其他成员有什么特点呢?

  • 原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的
    调用局部名称 直接用名称调用
    调用子类成员变量 用this.
    调用父类成员变量 用super.

2.7 子类中访问构造器的特点

各位同学,我们知道一个类中可以写成员变量、成员方法,还有构造器。在继承关系下,子类访问成员变量和成员方法的特点我们已经学过了;接下来再学习子类中访问构造器的特点。

我们先认识子类构造器的语法特点,再讲一下子类构造器的应用场景

子类中访问构造器的语法规则

  • 首先,子类全部构造器,都会先调用父类构造器,再执行自己。

    执行顺序,如下图按照① ② ③ 步骤执行:
    在这里插入图片描述

子类访问构造器的应用场景

  • 如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。

在这里插入图片描述

在本类中访问自己的构造方法

刚才我们学习了通过super()super(参数)可以访问父类的构造器。有时候我们也需要访问自己类的构造器。语法如下

this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器

在这里插入图片描述

最后我们被this和super的用法在总结一下

访问本类成员:
	this.成员变量	//访问本类成员变量
	this.成员方法	//调用本类成员方法
	this()		   //调用本类空参数构造器
    this(参数)	  //调用本类有参数构造器
	
访问父类成员:
	super.成员变量	//访问父类成员变量
	super.成员方法	//调用父类成员方法
	super()		   //调用父类空参数构造器
    super(参数)	  //调用父类有参数构造器
    
注意:this和super访问构造方法,只能用到构造方法的第一句,否则会报错。

子类构造器的特点:

  • 子类的全部构造器,都会先调用父类的构造器,在执行自己。

子类构造器是如何实现调用父类构造器的

  • 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),他会调用父类的无参数构造器
  • 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(…),指定去调用父类的有参数构造器
    在这里插入图片描述

一、多态

接下来,我们学习面向对象三大特征的的最后一个特征——多态。

1.1 多态概述

什么是多态?

多态是在继承、实现情况下的一种现象,表现为:对象多态、行为多态。

比如:Teacher和Student都是People的子类,代码可以写成下面的样子

在这里插入图片描述

在这里插入图片描述

1.2 多态的好处

各位同学,刚才我们认识了什么是多态。那么多态的写法有什么好处呢?

在多态形式下,右边的代码是解耦合的,更便于扩展和维护。

  • 怎么理解这句话呢?比如刚开始p1指向Student对象,run方法执行的就是Student对象的业务;假如p1指向Student对象 ,run方法执行的自然是Student对象的业务。

在这里插入图片描述

定义方法时,使用父类类型作为形参,可以接收一切子类对象,扩展行更强,更便利。

public class Test2 {
    public static void main(String[] args) {
        // 目标:掌握使用多态的好处
		Teacher t = new Teacher();
		go(t);

        Student s = new Student();
        go(s);
    }

    //参数People p既可以接收Student对象,也能接收Teacher对象。
    public static void go(People p){
        System.out.println("开始------------------------");
        p.run();
        System.out.println("结束------------------------");
    }
}

1.3 类型转换

虽然多态形式下有一些好处,但是也有一些弊端。在多态形式下,不能调用子类特有的方法,比如在Teacher类中多了一个teach方法,在Student类中多了一个study方法,这两个方法在多态形式下是不能直接调用的。

在这里插入图片描述

多态形式下不能直接调用子类特有方法,但是转型后是可以调用的。这里所说的转型就是把父类变量转换为子类类型。格式如下:

//如果p接收的是子类对象
if(父类变量 instance 子类){
    //则可以将p转换为子类类型
    子类 变量名 = (子类)父类变量;
}

在这里插入图片描述

如果类型转换错了,就会出现类型转换异常ClassCastException,比如把Teacher类型转换成了Student类型.

在这里插入图片描述

关于多态转型问题,我们最终记住一句话:原本是什么类型,才能还原成什么类型

总结
在这里插入图片描述

标签:调用,Java,进阶,子类,成员,多态,面向对象,父类,public
From: https://blog.csdn.net/m0_63763668/article/details/137554627

相关文章

  • UI Toolkit进阶 - Template模板
    上篇文章我们介绍了UIToolkit,但是没有深入它的用法。本文就以一个项目界面从UGUI到UIToolkit的改造过程为例,来学习一下较高阶的使用方法。首先介绍一下本次的项目MarkovCraft,这个项目是在MarkovJunior基础上的一个二次开发,把原项目放在了Unity中,让用户在三维环境中看到动态的生......
  • Kafka 进阶
    1、为什么有消息系统解耦合异步处理例如电商平台,秒杀活动。一般流程会分为:1:风险控制、2:库存锁定、3:生成订单、4:短信通知、5:更新数据通过消息系统将秒杀活动业务拆分开,将不急需处理的业务放在后面慢慢处理;流程改为:1:风险控制、2:库存锁定、3:消息系统、4:生成订单、5:短信通知......
  • 类鸡兔同笼(java)
    【题目】共有50枚硬币,可能包括4种类型:1元,5角,1角,5分。已知总价值为20元。求各种硬币的数量。【代码】publicclassTest12{publicstaticvoidmain(String[]args){//i是1元j是5角k是1角l是5分intsum=0;inti=0,j=0,k=0,l......
  • java 对List<Map<String, Object>>遍历
    在Java中,遍历List<Map<String,Object>>可以通过多种方式来实现。以下是一些常见的方法:使用for-each循环javaList<Map<String,Object>>list=//初始化你的Listfor(Map<String,Object>map:list){for(Map.Entry<String,Object>entry:map.entrySet()){......
  • JAVA 处理目录下及子目录下 图片压缩和图片加水印
    JAVA处理目录下及子目录下图片压缩压缩需要用到其他jar包<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.14</version></dependency>处理目录下及子目录下图片压缩importnet.coobird.thum......
  • java基础的一小点
    java文件启动的一套流程:.java---通过编译器javac---->.class---经过解释器&JIT--->机器码--->电脑可识别运行 一般而言,不是开发的安个jre就行,但类似于jsp编译就需要jdk的开发工具。JIT(justintime)即使编译器,可对热点代码直接编译。所以说比解释性语言快些、解释和编译型语......
  • java -动态sql语句
    数据库算法双子针、动态规划、二分查找、贪心算法、深度优先搜索、字符串、递归、字典树、排序、链表等元素作用描述if......
  • Java 实例 - 在控制台上随机得到两个数之间的任意整数值(Random随机数)
       在控制台上随机得到4~11之间的任意值,含4和11 1packagecom.guyu.demo;23importjava.util.Random;45/**6*7*2024年4月9日上午10:39:438*@authorGuyu9*10*随机数示例:11*在控制台上随机得到4~11之间的任意......
  • java-validation(数据校验)
    @PostMapping("/register")@SystemLog(BusinessName="注册用户")//启动AOP实现日志记录publicResponseResultregister(@Validated(ValidateType.INSERT.class)@RequestBodyTsUsertsUser){returntsUserService.register(tsUser);......
  • java-queryWrapper条件
    QueryWrapper1.eq、ne2.gt、ge、lt、le3.between、notBetween4.like、notLike、likeLeft、likeRight5.isNull、isNotNull6.in、notIn7.or、and8.orderByAsc、orderByDesc9.inSql、notInSql(不常用)10.exists、notExists(不常用)11List(不常用)12groupby分组(不常......