首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java基础】封装、继承、多态

【Java基础】封装、继承、多态

作者头像
全栈开发日记
发布2022-05-12 19:57:44
发布2022-05-12 19:57:44
4660
举报
文章被收录于专栏:全栈开发日记全栈开发日记

构造器

因为在之前的文章中又提到构造器,而且下文例子中也有构造器的使用,所以我们先来看一下构造器。

构造器也称为构造方法,其作用就是在new的同时,对成员变量进行赋值,给对象的属性赋予初始值,其格式为:

代码语言:javascript
复制
权限 类名(参数列表){
    方法体
}

从上可以看出,构造方法是不允许写返回值的,但不代表它没有返回值,因为它是用于new对象的,所以返回值也就是类对象本身;二是方法名必须和类名完全一致。

构造方法的写法有了,那么它是怎么运行的呢?构造方法在new的时候自动运行,只运行一次。每new一次都会运行一次。

每个class中都要有构造方法,如果不手动创建,那么Java会在编译的时候自动去添加一个无参的构造方法,如果有,那么就不会自动添加。另外,接口(interface)中是不允许出现构造方法的,所以接口不能new。

封装

在Java中,封装 一是用来隐藏对象的属性和实现细节,仅仅对外公开接口,从而控制程序中属性的读写访问级别,二是用来提高代码的复用性,如下例子:

代码语言:javascript
复制
public class Person{
    
    /** 名字属性 */
    private String name;
    
    /** 年龄属性 */
    private int age;
    
    /** 性别属性 */
    private String gender;
    
    /** 构造器 */
    public Person(String gender){
        this.gender = gender
    }
    
    /** 设置姓名 */
    public void setName(String name){
        this.name = name;
    }
    
    /** 获取姓名 */
    public String getName(){
        return this.name;
    }
    
    /** 设置年龄 */
    public void setAge(int age){
        this.age = age;
    }
    
    /** 获取年龄 */
    public int getAge(){
        return this.age;
    }
    
    /** 获取性别 */
    public String getGender(){
        return this.gender;
    }
    
}

public class Test01{
    public static void main (String[] args){
        Person person = new Person("男");
        person.setName("张三");
        person.setAge("18");
    }
}

在这个例子中,因为人的性别的不变的(正常情况下),所以我们采用构造器对性别属性进行了初始化,并将属性权限设置为私有的,并且没有添加设置方法,所以初始化后的性别是不允许修改的。但是姓名和年龄是允许修改的,所有我们虽然属性是私有的,但是我们添加了对外的接口,也就是set方法,这便使其可以修改了。

继承

继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有类称作父类。子类会自动拥有父类中“可以”继承的属性和方法。在子类中,可以直接调用父类的成员变量及方法。继承的格式如下:

代码语言:javascript
复制
权限修饰符 class 子类名 extends 父类名{
    内容
}

好处

  • 继承的出现提高了代码的复用性,提高了软件开发的效率;
  • 让类与类之间产生了关系,为多态提供了前提。

弊端

类与类之间的耦合度过高。

特点

  • 可以单继承,不可以多继承,但可以多重继承;
  • 所有的类都直接或间接继承了Object类。

注意

  • 使用关键字 extends 让类与类之间产生继承关系;
  • 父类的私有成员,子类不能继承;
  • 不能为了继承某个功能而随意进行继承的操作。

成员变量和成员方法的继承关系

  • 不同名的成员变量或成员方法,子类直接继承使用;
  • 同名的变量或方法,默认访问子类自己的成员变量或方法,想访问父 类中的可以使用super关键字,如:super.成员变量。

抽象

抽象方法

使用关键字abstract修饰并没有方法体的方法,称之为抽象方法。必须存在于抽象类中。

抽象类

抽象类是一些具有相同特征的类不断的进行共性收取出来的类,使用关键字abstract表明它是一个抽象类,并且它一定是一个父类。

抽象类在使用时要定义子类继承抽象类,将抽象类进行重写,创建子类的对象。其子类只有重写了抽象类中的所有方法后,才能创建对象,否则该子类还是一个抽象类。

下面是个例子:

代码语言:javascript
复制
public abstract class Test02{
public int sum(int a, int b);
    
    public double avg(int a, int b);
}
public class Test02 extends Text02{
    public int sum(int a, int b){
        return a+b;
    }
    
    public double avg(int a, int b){
        return (a+b)/2;
    }
}

接口

接口就是一个公共的模范标准,只要符合规范标准,都可以使用,使用关键字interface进行标明,并且是一个引用数据类型。其格式如下:

代码语言:javascript
复制
public interface 接口名称{ 
    //接口内容(最重要的内容是抽象方法) 
}

接口中可以包含的内容

在jdk7之前,只可以包含常量和抽象方法。

jdk8中新增了默认方法和抽象方法。默认方法可以通过接口的实现类对象直接调用,也可以被接口的实现类进行覆盖重写。静态方法不能通过接口实现类对象来调用,只能通过接口的名称,直接调用接口的静态方法。

jdk9中又增加了私有方法。静态私有方法,解决静态方法之间重复代码的问题普通私有方法,解决多个默认方法之间重复代码的问题。

使用

上文说到,因为接口没有构造器,所有不能new,因此接口不能直接使用,必须有一个“实现类”通过关键字implements“实现”该接口,且必须重写接口中的所有抽象方法 ,其格式如下

代码语言:javascript
复制
public calss 实现类名 implements 接口名称{
    
}

定义接口要注意以下几点:

  • 如果实现类没有重写接口中的所有抽象方法,那么这个实现类自己就必须是一个抽象类;
  • 在任何 Java 版本中,接口都能定义抽象方法;
  • 接口中的抽象方法修饰符必须是两个固定的关键字:public abstract,这两个关键字的修饰符可以选择性的忽略;
  • 方法的三要素可以随意定义;
  • 接口中也可以定义成员变量,但是必须使用 public static final 修饰,说明是不可改变的,public static final 也可省略;
  • 接口定义的就是常量,接口中的常量必须进行赋值,不赋值会报错;
  • 接口中的常量名称,使用完全大写的字母,用下划线进行分割;
  • 接口中没有静态代码块或者是构造方法;
  • 一个类的直接父类是唯一的,但是一个类可以实现多个接口,接口名用“,”隔开;
  • 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可;
  • 一个类如果直接父类当中的方法,和接口中的默认方法产生了冲突,优先使用父类当中的方法

多态

一个对象拥有多种形态,就是对象的多态性,继承和接口的实现为多态产生了前提。代码中的多态性,就是父类引用指向子类的对象,其使用方法如下:

代码语言:javascript
复制
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();

多态情况下,访问成员变量也有所不同:一种是直接通过对象名称访问成员变量,这个时候要看等于号左边是谁就优先用谁,没有则向上找;二是间接通过成员方法访问成员变量,这个时候要看该方法属于谁,如果子类没有重写方法,那方法就属于父类,如果子类重写了方法,那方法就属于子类。

多态的转型

多态转型分向上转型和向下转型:

向上转型就是右侧创建一个子类的对象,把他当作父类来看待使用,类似于数据类型的自动转换。向上转型一定是安全的,但是一旦向上转型,将无法调用子类原本的特有内容。向上转型格式如下:

代码语言:javascript
复制
父类名称 对象名 = new 子类名称();

向下转型就是将父类的对象,“还原”成本来的子类对象,类似于数据类型强制转换。需要注意的是要把 x 类的对象向下转型,必须保证对象本来创建的时候就是 x 类,才能向下转型。向下转型格式如下:

代码语言:javascript
复制
子类名称 对象名 = (子类名称)父类对象;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构造器
  • 封装
  • 继承
  • 抽象
  • 接口
  • 多态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档