面向对象基础小结

news2024/11/18 14:00:28

面向对象基础小结

面向对象和面向过程的区别

两者的主要区别在于解决问题的方式不同:

  • 面向过程:是把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
  • 面向对象:会先抽象出对象,然后用对象执行方法的方式解决问题。

面向对象开发的程序一般更易维护、易复用、易扩展。

求圆的面积和周长的示例

面向过程:

直接定义圆的半径,并使用该半径直接计算出圆的面积和周长(即将问题的过程拆分成了两个方法来解决)。

public class Main {
    public static void main(String[] args) {
        // 定义圆的半径
        double radius = 3.0;

        // 计算圆的面积和周长
        double area = Math.PI * radius * radius;
        double perimeter = 2 * Math.PI * radius;

        // 输出圆的面积和周长
        System.out.println("圆的面积为:" + area);
        System.out.println("圆的周长为:" + perimeter);
    }
}

面向对象:

定义一个 Circle 类来表示圆(即先抽象出一个对象),该类包含了圆的半径属性和计算面积、周长的方法(用对象的方法解决问题)。

public class Circle {
    // 定义圆的半径
    private double radius;

    // 构造函数
    public Circle(double radius) {
        this.radius = radius;
    }

    // 计算圆的面积
    public double getArea() {
        return Math.PI * radius * radius;
    }

    // 计算圆的周长
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }

    public static void main(String[] args) {
        // 创建一个半径为3的圆
        Circle circle = new Circle(3.0);

        // 输出圆的面积和周长
        System.out.println("圆的面积为:" + circle.getArea());
        System.out.println("圆的周长为:" + circle.getPerimeter());
    }
}

创建一个对象用什么运算符?对象实体与对象引用有何不同?

new 运算符。

  • new 创建对象实例(对象实例在堆内存中),
  • 对象引用指向对象实例(对象引用存放在栈内存中)。
  • 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)
  • 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球)

对象的相等和引用相等的区别

  • 对象的相等一般比较的是内存中存放的内容是否相等。
  • 引用相等一般比较的是他们指向的内存地址是否相等。
String str1 = "hello";
String str2 = new String("hello");
String str3 = "hello";
// 使用 == 比较字符串的引用相等
System.out.println(str1 == str2); // false -- 一个在常量池中,一个在堆内存中
System.out.println(str1 == str3); // true -- 都在常量池中
// 使用 equals 方法比较字符串的相等
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true

构造方法有哪些特点?是否可被 override?

构造方法特点如下:

  • 名字与类名相同。
  • 没有返回值,但不能用 void 声明构造函数。
  • 生成类的对象时自动执行,无需调用。
public class Person {
    private String name;
    private int age;
    
    // 构造方法没有返回值,并且不能用void声明构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void display() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
    public static void main(String[] args) {
        // 生成对象时自动执行构造方法
        Person person = new Person("John", 25);
        person.display();
    }
}

构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况

面向对象三大特征

面向对象编程的三大特征是:封装、继承和多态。

  1. 封装(Encapsulation):封装是将对象的属性和方法组合在一起,形成一个独立的、自包含的整体,对外部隐藏对象的内部细节,只向外部提供公共接口(方法),以便外部的代码能够通过这些接口访问对象。封装可以提高代码的可维护性和重用性,同时也可以保护对象的数据安全。

    // 例如 封装一个实体类
    public class Person {
        private String name;
        private int age;
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    
  2. 继承(Inheritance):继承是指在已有类的基础上,创建一个新的类,并且让新类拥有已有类的属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以在不重复编写代码的情况下,拥有父类的公共属性和方法,同时还可以增加自己的属性和方法,以实现更加复杂的功能。

    // 继承上面那个父类,下面这个是子类
    public class Student extends Person {
        private int grade;
        public Student(String name, int age, int grade) {
            super(name, age);
            this.grade = grade;
        }
        public int getGrade() {
            return grade;
        }
        public void setGrade(int grade) {
            this.grade = grade;
        }
    }
    
  3. 多态(Polymorphism):多态是指同一个方法调用,由于对象不同可能会产生不同的行为。多态可以让不同的对象对同一个消息做出不同的响应,从而提高代码的灵活性和可扩展性。多态有两种实现方式:静态多态(重载)和动态多态(重写和接口实现)。

    • 在 Java 中,多态的实现主要依赖于两个机制:继承和方法重写

    • 调用子类中重写的 move() 方法,从而产生不同的行为。这就是多态的体现。

    // 多态示例代码
    public class Animal {
        public void move() {
            System.out.println("Animal move");
        }
    }
    public class Dog extends Animal {
        public void move() {
            System.out.println("Dog move");
        }
    }
    public class Cat extends Animal {
        public void move() {
            System.out.println("Cat move");
        }
    }
    public class Main {
        public static void main(String[] args) {
            Animal a1 = new Animal();
            Animal a2 = new Dog(); // 使用子类对象替换父类对象
            Animal a3 = new Cat(); // 使用子类对象替换父类对象
            a1.move();
            a2.move();
            a3.move();
        }
    }
    

注意,三个对象指定的都是 父类(Animal)

关于继承如下 3 点需要记住:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。

子类无法直接访问父类的私有属性和方法

class ParentClass {
    private String privateProperty = "Private property";

    public void publicMethod() {
        System.out.println("Public method");
    }

    private void privateMethod() {
        System.out.println("Private method");
    }
}

class ChildClass extends ParentClass {
    public void childMethod() {
        System.out.println("Child method");
        System.out.println(publicProperty); // 子类可以访问父类的公有属性
        publicMethod(); // 子类可以调用父类的公有方法
        // 子类无法访问父类的私有属性和私有方法
        // System.out.println(privateProperty); // 这行代码会报错
        // privateMethod(); // 这行代码会报错
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建子类对象
        ChildClass child = new ChildClass();

        // 子类对象可以访问和调用父类的公有属性和方法
        System.out.println(child.publicProperty);
        child.publicMethod();
    }
}

子类可以间接访问父类的私有成员 – 所以说拥有

class ParentClass {
    private String privateProperty = "Private property";

    private void privateMethod() {
        System.out.println("Private method");
    }

    public void accessPrivateMembers() {
        System.out.println(privateProperty); // 子类间接访问父类的私有属性
        privateMethod(); // 子类间接调用父类的私有方法
    }
}

class ChildClass extends ParentClass {
    // 子类继承了父类的私有属性和私有方法,但无法直接访问

    public void accessParentPrivateMembers() {
        accessPrivateMembers(); // 子类间接访问父类的私有成员
    }
}

public class Main {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();
        child.accessParentPrivateMembers();
    }
}

多态的特点:

  • 对象类型(父类)和引用类型(子类)之间具有继承(类)/实现(接口)的关系;
  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  • 多态不能调用“只在子类存在但在父类不存在”的方法;(多态指向的都是父类)
  • 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

接口和抽象类有什么共同点和区别?

interfaceabstract

共同点

  • 都不能被实例化。
  • 都可以包含抽象方法。
  • 都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)。

区别

  • 【接口】主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。【抽象类】主要用于代码复用,强调的是所属关系。
  • 一个类只能继承一个类,但是可以实现多个接口。
  • 【接口】中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而【抽象类】的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
// 定义一个接口
public interface Animal {
    public void eat();
}
// 定义一个抽象类
public abstract class Vehicle {
    private int speed;
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public int getSpeed() {
        return speed;
    }
    public abstract void run(); // 抽象方法
}
// 实现接口
public class Dog implements Animal {
    public void eat() {
        System.out.println("The dog is eating.");
    }
}
// 继承抽象类
public class Car extends Vehicle {
    public void run() {
        System.out.println("The car is running.");
    }
}
// 测试类
public class Test {
    public static void main(String[] args) {
        // 使用接口
        Animal animal = new Dog();
        animal.eat(); // The dog is eating.
        // 使用抽象类
        Vehicle vehicle = new Car();
        vehicle.setSpeed(60);
        System.out.println("The speed of the car is " + vehicle.getSpeed() + " km/h."); // The speed of the car is 60 km/h.
        vehicle.run(); // The car is running.
    }
}

深拷贝和浅拷贝的区别了解吗?什么是引用拷贝?

【深拷贝】会完全复制整个对象,会在堆上新创建一个地址(原对象的内部对象 Address);

而【浅拷贝】只会在堆上新创建一个对象,但是内部地址还是原对象的,与原对象共用一个 Address 对象。

【引用拷贝】不会创建一个新的对象,而只是单纯的引用堆里面的原对象。

  System.out.println("The speed of the car is " + vehicle.getSpeed() + " km/h."); // The speed of the car is 60 km/h.
        vehicle.run(); // The car is running.
    }
}

深拷贝和浅拷贝的区别了解吗?什么是引用拷贝?

【深拷贝】会完全复制整个对象,会在堆上新创建一个地址(原对象的内部对象 Address);

而【浅拷贝】只会在堆上新创建一个对象,但是内部地址还是原对象的,与原对象共用一个 Address 对象。

【引用拷贝】不会创建一个新的对象,而只是单纯的引用堆里面的原对象。
在这里插入图片描述

学习参考

Java基础常见面试题总结(中) | JavaGuide(Java面试 + 学习指南)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

探索数字化转型项目的基础

从消费品到特种化学品,数字化转型正在各行各业中逐渐普及。然而,尽管使用智能化设备、连接解决方案和数据分析对改造升级制造运营模式有巨大帮助,但起步过程(奠定一个良好的基础来支撑工厂的可访问性、可靠性、可维护性、可扩展性…

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了,ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去,让EM13C 来实现对RACDG的监控,主要是DG的EM13C的监控,还没有看到,大部分都是直接…

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速,除了具备基础的加速功效外,高防CDN在每一节点上均有相应配置的防御功效,不仅具备了隐藏源站不被攻击的优势,也具备了访问加速,多节点防御的功效。随着互联网的不断发展,网络上的…

MOM系统功能清单

什么是MOM系统? MOM系统是制造运营管理(Manufacturing Operation Management)的缩写。它是指通过协调管理企业的人员、设备、物料和能源等资源,把原材料或零件转化为产品的活动。MOM系统集成了生产计划、库存管理、生产调度、质量…

Haskell 安装 Cairo

背景 Haskell 项目需要使用到柱状图,折线图等(demo 代码) 步骤(默认已安装 stack, cabal, ghcup) nameversionstack2.11.1cabal3.8.1.0ghcup0.1.20.0 在 package.yaml 中添加所需依赖 Chart 和 Chart-cairo name:…

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis ,注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql(必须),quartz.sql(可选&…

更快更稳的剃须伙伴,DOCO黑刃电动剃须刀体验

现在的电动剃须刀选择很多,我觉得三刀头的旋转式剃须刀很好用,比如我目前用的这款DOCO黑刃剃须刀,在剃须效率、舒适度和易用性等方面都表现不错,很适合日常使用。 这款剃须刀采用磁吸式刀头,这一设计非常方便清洁与更换…

docker容器入门

docker容器入门 1.1 容器介绍 容器技术是一种操作系统级的虚拟化技术,它允许在一个物理或虚拟机上运行多个隔离的应用程序实例,每个实例都被封装在一个独立的容器中。每个容器都包含应用程序及其依赖的运行时环境,如操作系统、库文件和配置…

【代码随想录】算法训练计划35

贪心 1、860. 柠檬水找零 题目: 输入:bills [5,5,5,10,20] 输出:true 思路: 模拟大法 func lemonadeChange(bills []int) bool {//贪心,代码一刷, 感觉要用到hashmap,也不用five, ten : 0…

文件操作在 Python 中的基本用法

更多资料获取 📚 个人网站:ipengtao.com 文件操作是任何编程语言中都至关重要的一部分,Python 提供了简单而强大的文件操作功能,使得读取、写入和处理文件变得非常便捷。本文将详细介绍 Python 中文件操作的基本用法,…

SpringBoot使用动态Banner

SpringBoot使用动态Banner Spring Boot 2.0 提供了很多新特性&#xff0c;其中就有动态 Banner。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://w…

sizeof 和 strlen的对比及笔试题目

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 二维数组题&#xff08;重点&#xff09;&#xff1a; 上述题目总结&#xff1a; 若想了解其他的字符函数和字符串函数请移步&#xff1a;深入理解…

Gin投票系统(2)

投票系统 数据库的建立 先分析需求&#xff0c;在sql中建立数据库&#xff0c;关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表&#xff1a; vote&#xff0c;user&#xff0c;vote_opt,vote_opt_user 建立数据库&#xff0c;可以…

万字解析设计模式之迭代器模式、备忘录模式

一、迭代器模式 1.1概述 迭代器模式是一种行为型设计模式&#xff0c;它允许在没有暴露其底层表现形式的情况下遍历集合对象。迭代器模式提供一种通用的遍历机制&#xff0c;可以遍历任何类型的集合&#xff0c;包括数组、列表、树等。通过这种模式&#xff0c;可以实现一种通…

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员&#xff1a;个人中心&#xff0c;用户管理&#xff0c;热点信息管理&#xff0c;疾病管理&#xff0c;疾病类型管理&#xff0c;治疗管理&#xff0c;治疗类型管理&#xff0c;护理管理&#xff0c;护理类型管理&#xff0c;科普管理&#xff0c;科普类型…

Microsoft Office Exce-筛选后的公式批量复制粘贴为值 并且不乱数据

Microsoft Office Exce-利用选择性粘贴将筛选后的公式结果批量转换为值 1、写好【客单价】公式&#xff0c;并下拉填充 &#xff08;【SKU】、【销售额】、【销售量】这三列都是常量&#xff0c;非公式&#xff09; 2、复制客单价公式到E列 3、筛选数据&#xff0c; 按 Delet…

成员内部类(内部类) - Java

成员内部类 说明&#xff1a;成员内部类是定义在外部类的成员位置&#xff0c;并且没有static修饰。 可以直接访问外部类的所有成员&#xff0c;包含私有的。【案例a】可以添加任意访问修饰符&#xff08;public、protected、默认、private&#xff09;&#xff0c;因为它的地…

数组中的第 K 个最大元素(C++实现)

数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列&#xff08;最大堆&#xff09;来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素&#xff0c;留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…

某东大厂面试js手写题【手写代码附带注释,放心食用,博主亲测】

文章目录 前言js实现push方法js实现订阅发布手写防抖节流手写reduce方法深拷贝es5去重数组多维数组去重排序简单递归实现树形结构输出遍历后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前…