脉金捷脉金捷
主页
  • VuePress
  • VuePress2
  • Markdown基础命令
  • Java特性
  • Java修饰符
  • Java常见问题
  • Java LocalDate
  • Java Cloud ID
  • Docker-CentOS8
  • Docker-Nginx
  • Docker-Redis
  • Docker-MySQL
  • Docker-Nacos
  • Docker-Seata
  • Docker-Nodejs
  • Docker-runlike
  • Docker基础命令
  • Linux基础软件
  • Linux-SSH登录
  • Linux防火墙-iptables
  • Linux系统目录
主页
  • VuePress
  • VuePress2
  • Markdown基础命令
  • Java特性
  • Java修饰符
  • Java常见问题
  • Java LocalDate
  • Java Cloud ID
  • Docker-CentOS8
  • Docker-Nginx
  • Docker-Redis
  • Docker-MySQL
  • Docker-Nacos
  • Docker-Seata
  • Docker-Nodejs
  • Docker-runlike
  • Docker基础命令
  • Linux基础软件
  • Linux-SSH登录
  • Linux防火墙-iptables
  • Linux系统目录
  • Java特性
  • Java修饰符
  • Java常见问题
  • Java LocalDate
  • Java Cloud ID

Java面向对象的四个特征

Java面向对象具有以下四个主要特征:抽象(abstract)、继承(inherutance)、封装(Encapsulation)、多态(Polimorphism)。

抽象(abstract)

抽象是从众多的事物中抽取其共同的、本性的特征,而忽略其非本质的特征的过程。

抽象把对象的属性和方法罗列出来,忽略具体的代码实现,只关注对象的本质特征。

  • 在方法前加上 abstract 关键字,去掉大括号,直接分号结束,就成了抽象方法。
  • 抽象方法所在的类,必须是抽象类。
  • 在class前面写上 abstract 就是抽象类。
  • 不能创建抽象类对象,只能创建其子类且非抽象的对象。
  • 抽象类可以有构造方法,是提供子类创建对象时,初始化父类成员使用的,例如super()。
  • 抽象类不一定包含抽象方法,但是有抽象方法的类必须是抽象类。
  • 抽象类的子类必须重写抽象父类中所有的抽象方法,除非子类也是抽象类。

封装(Encapsulation)

  • 封装隐藏实现细节,对外提供方法或接口,防止内部代码和数据被外部访问,实现代码的高内聚和低耦合。
  • 外部只需要调用需要的方法或接口,无须关注其具体的实现过程,其实现过程发生改变也不会印象外部使用。
  • 通常用 private 修饰屏蔽外层无须关注的变量和方法,用 public 修饰开放外层可调用的变量和方法。(访问权限可查看 Java修饰符)

继承(inheritance)

  • 基于父类(基类、超类)创造子类(派生类),子类拥有可从父类继承下来的内容。

  • 继承主要解决的问题就是共性抽取。

  • 访问成员变量的两种方式

    • 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。

      // 个人简写笔记,并非代码格式
      
      父类:{num:10}
      子类:{num:20,age:18}
      
      父类 f = new 子类();
      f.num:10
      f.age: 报错
      
    • 间接通过成员方法范文成员变量:看该方法属于谁,优先用谁,没有则向上找。

      // 个人简写笔记,并非代码格式
      
      父类:{num:10,getNum->num}
      子类:{num:20,getNum->num}
      
      父类 f = new 子类(); 
      f.getNum:20
      
      // 如果子类没有覆盖重写getNum方法,则返回父属性=10
      
  • 区分成员变量的三种调用方式

    • 局部变量:直接写成员变量名
    • 本类的成员变量:this.成员变量名
    • 父类的成员变量:super.成员变量名
  • 访问成员方法的规则

    • 创建的对象是谁(等号左边),优先用谁,如果没有则向上找。
  • 重写(Override):父子类方法的名称一样,参数列表页一样。覆盖父类方法。

    • 必须保证父子类之间的方法名称相同,参数列表页相同。
      • @Override:写在方法前面,用来检测是不是有效的覆盖重写。
      • @Override 这个注解就算不写,只要满足要求,也是有效的覆盖重写。
    • 子类方法的返回值必须小于或等于父类方法的返回值范围。
      • 例如父类返回 Object,子类返回 String,String 是 Object 的子类。
    • 子类方法的权限必须大于或等于父类方法权限修饰符。
      • 修饰符权限:public > protected > (default) > private。
      • (default) 不是关键字 default,而是什么都不写。
  • 重载(Overload):方法的名称一样,参数列表不一样。

  • 父子类构造方法的访问特点

    • 子类构造方法当中有一个默认隐含的 "super()" 调用,所以一定是先调用父类构造,后执行子类构造。
    • 子类可以通过 super 关键字来调用父类重载构造。
    • 子类构造方法中 super 的父类构造调用,必须是第一行语句。
    • 子类构造方法不能调用多次 super 构造。

多态(Polimorphizm)

一个对象拥有多种形态,这就是对象的多态性。

例如:人类(父类),学生(子类),小明同学是一个学生,同时也是一个人,小明这个对象拥有 “学生” 和 “人” 这两种形态。

  • extends(继承)或者implements(实现),是多态性得前提。

    • 代码体现格式:

      * 父类名称 对象名 = new 子类名称();
      * 接口名称 对象名 = new 实现类名称();
      
  • 对象的向上转型格式:父类名称 对象名 = new 子类名称();

  • 对象的向下转型格式:子类名称 对象名 = (子类名称)父类对象;

  • 可用 instanceof 判断对象属于什么子类。"对象 instanceof 类" 会返回boolean值,如果对象属于指定类则返回true。

Last Updated: 2/20/24, 12:20 PM
Contributors: maijinjie