首页 > 其他分享 >面向对象进阶第二天

面向对象进阶第二天

时间:2023-02-24 20:34:31浏览次数:42  
标签:进阶 子类 多态 接口 面向对象 第二天 修饰 new 方法

面向对象进阶第二天

权限修饰符

作用:约束成员变量,构造器,方法等的访问范围

 

自己定义成员(方法,成员变量,构造器等)一般需要满足如下要求:

  1. 成员变量一般私有。

  2. 方法一般公开。

  3. 如果该成员只希望本类访问,使用private修饰。

  4. 如果该成员只希望本类,同一个包下的其他类和不同包下的子类访问,使用protected修饰。

  5.  

     

final关键字

final最终的意思

  1. final修饰类:类不能被继承。工具类可以用final修饰。

  2. final修饰方法:该方法被称为最终方法,特点是不能被重写了。 模板方法可以用final

  3. final修饰变量:总规则:有且仅能被赋值一次。

    注意:final修饰基本数据类型的变量,其存储的数据不能改变。final修饰引用类型的变量,其存储的地址不能改变,但是指向的对象内容可以改变。

常量

  • 是什么?

    • public static final 修饰的成员变量,必须有初始化值,执行过程中值不能改变。

  • 作用:做系统的配置信息,做信息标志和分类

  • 规范:名称全部大写,多个单词用下划线连接

  • 常量在编译阶段会进行“宏替换”:把使用常量的地方全部替换成真实的字面量

  •  // 请在下方声名一个常量VERSION_NAME,值为"v1.0.0",用于记录系统的版本名称。
            public static final String VERSION_NAME = "v1.0.0";

     

抽象类

抽象类是什么?abstract修饰的类

抽象方法是什么?abstract修饰的方法,不能写方法体。

作用:

  1. 被子类继承。

  2. 如果父类知道子类一定要做这件事,但是每个子类做的不一样,父类可以声明抽象方法,交给子类重写来实现。这个类就是抽象类了。

抽象类的特点:

  1. 类有的成员(成员变量、方法、构造器)抽象类都具备

  2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

  3. 一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

  4. 不能用abstract修饰变量、代码块、构造器。

  5. 最重要的特征:得到了抽象方法,失去了创建对象的能力(有得有失)

 

 

模板方法设计模式

  • 模板方法模式解决了什么问题?

    1. 提高了代码的复用性

    2. 模板方法已经定义了通用结构,模板方法不能确定的部分定义成抽象方法,交给子类实现,因此,使用者只需要关心自己需要实现的功能即可。

    3. 模板方法模式中的通用结构建议加上final修饰,好处是可以防止子类重写模板方法。

多态

面向对象的三大特征之一:封装、继承、多态

含义? 指的是对象有多种形态

  • 人类型的对象:学生对象

  • 人类型的对象:老师对象

  • 人类型的对象:丈夫对象

语法形式:

  • 父类类型 变量名称 = new 子类构造器;

    Animal a = new Cat();

  • 接口 变量名称 = new 实现类构造器;

多态的调用方式

  • 对于方法的调用:编译看左边,运行看右边

    Animal a = new Cat();
    a.run();
  • 对于变量的调用

    • 编译看左边,运行也看左边(注意)

  • 多态更多用在行为多态

多态的使用前提

1、必须继承、实现

2、父类类型的变量指向子类类型的对象

Animal a = new Cat();

3、存在方法重写

Animal a = new Cat();
a.run();

多态的优势

  • a、多态可以实现解耦合

    Animal a = new Dog();
    a.run();
  • b、多态下,父类类型作为方法的入参,可以接收一切子类对象,这样更利于方法的扩展和便利性。

  • 注意存在的问题:

    • 多态下不能直接访问子类独有功能

      Animal a = new Dog();
      a.lookDoor();

多态下类型转换问题

  1. 自动类型转换

  • 从子类到父类

    Animal a = new Dog();

  1. 强制类型转换

  • 从父类到子类

  • Animal a = new Dog();

  • 必须强制类型转换,否则报错的

  • Dog d = (Dog) a;

  • 注意:

    • Java规定,有继承/实现关系的类就可以强制转换,编译阶段不会报错。但是运行时可能出现类型转换异常,ClassCastException。

      Animal a = new Cat();
      Dog d = (Dog)a;
    • 编译不出错。运行时出现类型转换异常。

  • Java建议在进行强制转换之前先通过instanceof判断真实数据类型,再强转

    Animal a = new Cat();
    if(a instanceof Cat) {
    Cat c = (Cat)a;
    }
  • 强制类型转换解决了什么问题?

    • 可以调用子类的独有功能了

接口

接口概定义与特点

  • Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。

    public interface 接口名 {
          // 成员变量(常量)
          // 成员方法(抽象方法)
    }

    JDK8之前接口中只能是常量和抽象方法,没有其他成分了。

    接口本质上是一种规范,约束实现接口的类必须具备某种能力。

  • 注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

    修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
    }
  • 一个类可以实现一个或多个接口,实现类实现多个接口,必须重写完全部接口中的全部抽象方法,否则实现类需要定义成抽象类。

接口与接口的关系:多继承

  • 一个接口可以同时继承多个接口

    注意:实现子接口名的类必须实现后面所有接口中的所有抽象方法。

  • 接口多继承的作用

    • 规范合并,整合多个接口为同一个接口,便于子类实现。

继承抽象类的同时实现多个接口

  • 类和类的关系

    • 单继承

  • 类和接口的关系

    • 多实现

  • 因此,我们可以在继承类的同时,实现1个或多个接口,语法如下:

    修饰符 class 实现类 extends 基类名 implements 接口1, 接口2, 接口3 , ... {
    }

使用接口的好处

  1. 弥补了类单继承的不足,一个类在单继承的同时还可以实现多个接口。

  2. 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(多态思想)。

JDK8开始接口新增的方法

  1. 默认方法

    • 类似之前写的普通实例方法:必须用default修饰

    • 默认会public修饰。需要用接口的实现类的对象来调用

      default void defaultMethod() {
      System.out.println("接口中的默认方法");
      }
  2. 静态方法

    • 默认会public修饰,必须static修饰。

    • 注意:接口的静态方法必须用本身的接口名来调用。

      static void staticMethod() {
      System.out.println("接口中的静态方法");
      }
  3. 私有方法

    • 必须使用private修饰,从JDK1.9才开始有的。

    • 根据是否有static关键字修饰,私有方法可以分为非静态私有方法和静态私有方法。

    • 非静态私有方法只能在本类中被其他的默认方法或者私有方法访问。

    • 静态私有方法还能在本类的其他静态方法中访问。

      private void privateMethod() {
      System.out.println("接口中的私有方法");
       
      }

使用接口的注意事项

  1. 接口不能创建对象

  2. 一个类实现多个接口,多个接口的规范不能冲突

  3. 一个类实现多个接口,多个接口中有同样的静态方法不冲突。

  4. 一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。

  5. 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

  6. 一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。

标签:进阶,子类,多态,接口,面向对象,第二天,修饰,new,方法
From: https://www.cnblogs.com/yaomagician/p/17153037.html

相关文章

  • Java面向对象进阶第一天
    面向对象高级第一天static关键字是静态的意思,可以修饰成员变量,也可以修饰成员方法成员变量的分类静态成员变量有static修饰,属于类,与类一起加载,内存中只有一份,可以......
  • 猜拳小游戏案例面向对象
    *Computer电脑类*属性:角色名,得分。*方法:出拳的方法1/**2*Computer电脑类3*属性:角色名,得分。4*方法:出拳的方法5*@authorlisi6*@......
  • 面向对象高级1-static&继承
    1,static1,static修饰成员变量static静态,可以修饰成员变量、成员方法。成员变量按照有无static修饰可以分为两种:类变量:属于类,与类一起加载一次,在内存中只有一份,可......
  • Kubernetes-Pod进阶
    目录:资源限制CPU资源单位内存资源单位重启策略健康检查/探针探针的三种规则Probe支持三种检查方法总结Pod进阶资源限制当定义Pod时可......
  • 购物车案例、v-model进阶、与后端交互、vue生命周期、vue组件
    购物车案例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jquer......
  • 面向对象编程
    1、面向对象编程1、特点封装:让使用对象的人不考虑内部实现,只考虑功能使用把内部的代码保护起来,只留出一些api接口供用户使用继承:就是为了代码的复用,从父类上继承出一......
  • 【C#进阶】.NET Core 中的筛选器 Filter【ActionFilterAttribute 操作筛选器,实现日志
     筛选器Filter介绍:【C#进阶】.NETCore中的筛选器Filter-C#初级程序员-博客园(cnblogs.com) ActionFilterAttribute操作筛选器,实现日志记录第一步创建.NE......
  • 努力学习第二天
    学习了javaweb里的增packageceshi;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;public......
  • 【JS】JavaScript进阶 ES6 - 黑马视频笔记
    1.作用域作用域(scope)规定了变量能够被访问的“范围”,离开这个范围变量便不能被访问。分为:局部作用域、全局作用域。1.1局部作用域局部作用域分为:函数作用域、块作用......
  • SQL进阶-存储引擎
    1.MySQL体系结构连接层最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的......