面向对象、接口/抽象类

本文详细介绍了Java中的面向对象概念,包括对象、类、OOP原则,以及重写和重载的区别。此外,还深入探讨了面向对象的三大特性:封装、继承和多态,并详细阐述了抽象类和接口的使用,包括它们的定义、异同及应用示例。
摘要由CSDN通过智能技术生成

一、对象

1.1 对象与类

”万物皆可对象。“

对象:是类的一个实例,具有自己的状态与行为。
类:类是一个模板,是对象的行为与状态的一种抽象描述。

例如:
动物是一个类,而狗是类的一个实例对象。狗的状态有:名字、品种、颜色;行为有:叫、摇尾巴和跑等。

在软件开发中,对象的状态对应属性,其行为行为通过方法体现。

1.2 面向对象程序设计(OOP)基本原则

"六原则一法则"的最终目的可概括为————高内聚、低耦合。

1)单一职责原则
一个类只做一件事,且只有一个发生变化的原因。(表达的就是"高内聚")

2)开闭原则
软件实体应当对扩展开放,对修改关闭。(抽象是关键,一个系统中如果没有抽象类或接口,系统就没有扩展点)

3)里氏替换原则
任何时候都可以用子类型替换掉父类型。(子类一定是增加父类的能力而不是减少父类的能力)

4)依赖倒置原则
面向接口编程,多态。(声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代)

5)接口隔离原则
接口要小而专,绝不能大而全。(Java中的接口代表能力、代表约定、代表角色,是高度内聚的)

6)合成聚合复用原则
优先使用聚合或合成关系复用代码。

类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。
其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码。
需要说明的是,即使在Java的API中也有不少滥用继承的例子,例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据,
而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。

注意:任何时候都不要继承工具类。工具类是可以拥有并使用的,而不是拿来继承的。

7)迪米特法则
又称”最少知识原则“,如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。(减小了系统的耦合度,提高模块的相对独立性)

1.3 匿名对象

匿名对象只能使用一次,且只在堆内存中开辟空间,而不存在栈内存的引用,此对象使用一次之后就等待被 GC(垃圾收集机制)回收。

public class Person {
   
    public String name; // 姓名
    public String sex; // 性别
    public int age; // 年龄

    // 定义构造方法,为属性初始化
    public Person(String name, String sex, int age) {
   
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    // 获取信息的方法
    public void tell() {
   
        System.out.println("姓名:" + name + ", 性别:" + sex + ", 年龄:" + age);
    }

    public static void main(String[] args) {
   
        new Person("张三", "男", 20).tell(); // 匿名对象
    }
}

1.4 对象的销毁

Java内存自动回收成为垃圾回收机制,简称GC
一个对象被当作垃圾回收的情况主要如下两种:

1)对象的引用超过其作用范围

{
   
    Object obj = new Object();    // 对象obj的作用范围,超过这个范围对象将被视为垃圾
}

2)对象被赋值为 null

{
   
    Object obj = new Object();
    obj = null;    // 对象被赋值为null将被视为垃圾
}

垃圾回收器只能回收那些由new操作符创建的对象。如果某些对象不是通过new操作符在内存中获取一块区域,这种对象可能不会被垃圾回收机制所识别。因此,Java提供了一个finalize()方法。

这个方法是Object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。

Counter 类在构造方法中增值,在析构方法中减值。如下所示为计数器类 Counter 的代码:

public class Counter {
   
    private static int count = 0;    // 计数器变量
    public Counter() {
   
        // 构造方法
        count++;    // 创建实例时增加值
    }
    public int getCount() {
   
        // 获取计数器的值
        return count;
    }
    @Override
    protected void finalize() {
   
        // 析构方法
        count--;    // 实例销毁时减少值
        System.out.println("对象销毁");
    }
}

创建一个带 main() 的 CounterTest类对计数器进行测试,示例代码如下:

public class CounterTest {
   
    public static void main(String[] args) {
   
        Counter cnt1 = new Counter();    // 建立第一个实例
        System.out.println("数量:" + cnt1.getCount());    // 输出1
        Counter cnt2 = new Counter();    // 建立第二个实例
        System
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值