Java Scala之面向对象

Java Scala之面向对象:完整攻略

什么是面向对象

面向对象(Object Oriented Programming,简称OOP)是一种编程范式,主要思想是将数据和对数据的相关操作封装在一个单元中,形成对象。通过对对象的定义、组合和继承等机制实现程序的可扩展性、灵活性和可维护性。

面向对象的三大特征

封装(Encapsulation)

封装就是将程序中的某些部分抽象成单独的对象,只向外部公布特定的接口,而隐藏其余的操作。从而增强程序的模块化、安全性和可重用性。

Java示例:用private修饰符限制了变量x的访问权限

public class Example {
    private int x; // 私有变量,只能在该类中访问

    public int getX() {
        return x; // 可以通过访问器方法间接访问
    }

    public void setX(int x) {
        this.x = x; // 可以通过修改器方法修改私有变量
    }
}

Scala示例:用private修饰符限制了变量x的访问权限

class Example {
  private var x = 0 // 私有变量,只能在该类中访问

  def getX = x // 可以通过访问器方法间接访问

  def setX(value: Int): Unit = x = value // 可以通过修改器方法修改私有变量
}

继承(Inheritance)

继承就是子类(派生类)自动获得父类(基类)的所有属性和方法。通过继承可以减少代码量,提高复用性和可维护性。

Java示例:Man继承了Person的属性和方法

public class Person {
    protected String name;
    protected int age;

    public void eat(){
        System.out.println(name + " is eating");
    }
}

public class Man extends Person {
    private boolean isMarried;

    public void work(){
        System.out.println(name + " is working");
    }
}

Scala示例:Man继承了Person的属性和方法

class Person {
  protected var name: String = _
  protected var age: Int = _

  def eat(): Unit = {
    println(name + " is eating")
  }
}

class Man extends Person {
  private var isMarried: Boolean = _

  def work(): Unit = {
    println(name + " is working")
  }
}

多态(Polymorphism)

多态就是在不同的情况下,同一个方法可以表现出不同的行为。通过多态可以增强程序的可扩展性和灵活性。

Java示例:不同的动物都可以eat()

public abstract class Animal {
    public abstract void eat();
}

public class Dog extends Animal {
    public void eat() {
        System.out.println("Dog is eating");
    }
}

public class Cat extends Animal {
    public void eat() {
        System.out.println("Cat is eating");
    }
}

Scala示例:不同的动物都可以eat()

abstract class Animal {
  def eat(): Unit
}

class Dog extends Animal {
  def eat(): Unit = {
    println("Dog is eating")
  }
}

class Cat extends Animal {
  def eat(): Unit = {
    println("Cat is eating")
  }
}

面向对象的设计原则

单一职责原则(Single Responsibility Principle)

单一职责原则就是一个对象只负责一项职责,避免职责耦合和职责扩散。这样可以增强代码的可维护性和可扩展性。

Java示例:Person只负责个人信息的存取,而不负责其他逻辑

public class Person {
    private String name;
    private int age;
    private String address;

    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }
}

Scala示例:Person只负责个人信息的存取,而不负责其他逻辑

class Person(val name: String, val age: Int, val address: String)

开闭原则(Open Closed Principle)

开闭原则就是开放已有的代码对扩展,关闭对修改。这样可以避免因改动已有代码而带来的风险和不必要的成本。

Java示例:ShapeRectangle都实现了Area接口,当要增加Circle时,不需要改动已有代码,只需要增加新的类即可。

public interface Area {
    public double getArea();
}

public class Shape implements Area {
    public double getArea() {
        // 计算图形的面积
    }
}

public class Rectangle implements Area {
    private double width;
    private double height;

    public double getArea() {
        return width * height;
    }
}

public class Circle implements Area {
    private double radius;

    public double getArea() {
        return Math.PI * radius * radius;
    }
}

Scala示例:ShapeRectangle都实现了Area接口,当要增加Circle时,不需要改动已有代码,只需要增加新的类即可。

trait Area {
  def getArea: Double
}

class Shape extends Area {
  def getArea: Double = {
    // 计算图形的面积
  }
}

class Rectangle(val width: Double, val height: Double) extends Area {
  def getArea: Double = width * height
}

class Circle(val radius: Double) extends Area {
  def getArea: Double = Math.PI * radius * radius
}

里氏替换原则(Liskov Substitution Principle)

里氏替换原则就是子类能够替换父类,在程序中使用父类对象的地方都能够使用子类对象,不产生意外的行为。这样可以增强程序的可扩展性和灵活性。

Java示例:RectangleShape的子类,可以替换Shape对象

public class Shape {
    public double getArea() {
        // 计算图形的面积
    }
}

public class Rectangle extends Shape {
    private double width;
    private double height;

    public double getArea() {
        return width * height;
    }
}

Scala示例:RectangleShape的子类,可以替换Shape对象

class Shape {
  def getArea: Double = {
    // 计算图形的面积
  }
}

class Rectangle(val width: Double, val height: Double) extends Shape {
  override def getArea: Double = width * height
}

总结

面向对象是一种重要的编程范式,具有封装、继承和多态三大特征。在面向对象的设计中,要遵循单一职责原则、开闭原则和里氏替换原则等设计原则。通过这些原则可以增强程序的可维护性、可扩展性和灵活性,提高代码的质量和可靠性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Scala之面向对象 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java class文件格式之属性详解_动力节点java学院整理

    Java Class文件格式之属性详解 在Java中,每个类都有一个对应的.class文件,它包含了该类的所有信息,包括成员变量、方法等。.class文件由以下几个部分构成: 魔数:4个字节,用于标识.class文件是否合法,固定值为0xCAFEBABE。 版本号:4个字节,分别表示主版本号和次版本号,用于标识该文件所对应的JVM版本。 常量池:变长结构,存…

    Java 2023年5月20日
    00
  • java读取配置文件(properties)的时候,unicode码转utf-8方式

    Java读取配置文件(properties)时,如果文件中含有中文或其他非英文字符,需要进行字符编码转换,否则会出现乱码现象。此时可以采用unicode到UTF-8的编码方式。 以下是Java读取配置文件(properties)时unicode码转UTF-8的完整攻略: 1. 首先在properties文件中保存中文字符 在编辑properties文件时,需…

    Java 2023年5月20日
    00
  • 使用阿里云OSS的服务端签名后直传功能的流程分析

    使用阿里云OSS的服务端签名后直传功能的流程分析可以分为以下几个步骤: 1. 准备工作 在使用阿里云OSS的服务端签名后直传功能之前,需要先进行一些准备工作: 获得阿里云OSS的AccessKeyId和AccessKeySecret 根据需要,创建阿里云OSS的Bucket,并设置Bucket的访问权限 确定需要上传到阿里云OSS的文件的名称和存放路径 2.…

    Java 2023年5月23日
    00
  • Spring Security实现基于角色的访问控制框架

    为了实现基于角色的访问控制,Spring提供了一个框架:Spring Security。它可以帮助我们管理用户的认证和授权,并提供一些便利工具来实现对不同角色的访问控制。本文将介绍如何使用Spring Security来实现基于角色的访问控制,并提供两个示例来辅助理解。 一、Spring Security的概念和架构 1.1. Spring Security…

    Java 2023年5月20日
    00
  • 一篇带你入门Java垃圾回收器

    一篇带你入门Java垃圾回收器 什么是Java垃圾回收器 Java垃圾回收器(Garbage Collector)是Java虚拟机(JVM)的重要组成部分。它管理内存分配和回收,以确保在应用程序运行期间,不会发生内存泄漏或溢出等问题。 垃圾回收器的工作原理 垃圾回收的核心是判断哪些内存块是“垃圾”,然后将其回收。在JVM中,垃圾回收器通过判断对象是否还被引用…

    Java 2023年5月26日
    00
  • Java客户端服务端上传接收文件实现详解

    Java客户端服务端上传接收文件实现详解 本文针对Java客户端与服务端之间的文件上传与接收过程进行详细讲解,包括服务端搭建、客户端实现、文件上传与接收等方面。 服务端搭建 服务端主要负责接收文件并进行处理。以下是搭建服务端的步骤: 创建一个Java项目 引入spring-boot-starter-web依赖(以Spring Boot为例) 创建文件上传接口…

    Java 2023年5月20日
    00
  • springboot常用语法库的基本语法

    Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。在开发过程中,我们经常需要使用一些常用的语法库,例如Spring Data JPA、Spring Security、Thymeleaf等。本文将详细讲解Spring Boot常用语法库的基本语法,包括如何配置、如何使用等。 1. Spring Data JPA Sprin…

    Java 2023年5月14日
    00
  • Java的Struts框架报错“ConfigurationResourcesNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NoSuchModuleException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 模块错误:如果模块不正确,则可能会出现此错误。在这种情况下,需要检查模块以解决此问题。 以下是两个实例: 例 1 如果配置文件中没…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部