2 面向对象编程

news2024/11/24 12:42:07

面向对象编程(OOP)

**面向对象的程序(oop)**是由对象组成的, 每个对象包含对用户公开的特定功能部分和隐藏的实现部分。

传统的结构化程序设计通过**设计一系列的过程(即算法)**来求解问题。一旦确定了这些过程, 就要开始考虑存储数据的方式。先要确定如何操作数据, 然后再决定如何组织数据, 以便于数据操作。 而 OOP 却调换了这个次序, 将数据放在第1位,然后再考虑操作数据的算法

1 类

类的要素:

  • 类( class) 是构造对象的模板或蓝图。

  • 由类构造(construct) 对象的过程称为创建类的实例 (instance )

  • 对象中的数据称为实例域( instance field )

  • 操纵数据的过程称为方法( method ),对于每个特定的 类实例(对象)都有一组特定的实例域值

  • 这些值的集合就是这个对象的当前状态( state )

类的三大特征:

  • 封装:实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互,这意味着一个类可以全面地改变存储数据的方式,只要仍旧使用同样的方法操作数据, 其他对象就不会知道或介意所发生的变化

  • 继承:在 Java 中, 所有的类都源自于一个“ 神通广大的超类”, 它就是 Object

1.1 类之间的关系

在类之间, 最常见的关系有

  • 依赖(“ uses-a”)
  • 聚合(“ has-a”)
  • 继承(“ is-a”)

如果一个类的方法操纵另一个 类的对象,我们就说一个类依赖于另一个类。例如,Order 类使用 Account 类是因为 Order 对象需要访问 Account 对象查看信用状态。应该尽可能地将相互依赖的类减至最少

聚合(aggregation ), 即“ has-a ” 关系,意味着类 A 的对象包含类 B 的对象。例如, 一个 Order 对象包含一些 Item 对象

1.2 属性与方法

[public] class 类名{
    访问权限 类型 属性1;
    访问权限 类型 属性2;
    访问权限 类型 属性3;
    访问权限 类型 属性n;
    
    访问权限 返回值类型 方法名1(参数列表){
        方法体;
    }
    访问权限 返回值类型 方法名2(参数列表){
        方法体;
    }
}
public class Rect_V1 {
    public static void main(String[] args) {
        Rect r = new Rect();
        //记录矩形信息,宽和高分别3,4
        r.width = 3;
        r.height = 4;
        //输出矩形信息
        int x = r.area();
        System.out.println("矩形面积是" + x);

    }
}

class Rect{
    public int width;
    public int height;

    public int area(){
        return width * height;
    }
}
//对象的设置使用函数实现
public class Rect_V2 {
    public static void main(String[] args) {
        Rect02 r = new Rect02();
        r.setHeight(3);
        r.setWidth(4);

        System.out.println("矩阵面积是" + r.area());
    }
}

class Rect02{
    private int width;
    private int height;

    public void setHeight(int height) {
        this.height = height;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int area(){return height*width;}
}

2 当前对象

对象的三个主要特性:

  • 对象的行为(behavior) —可以对对象施加哪些操作,或可以对对象施加哪些方法?
  • 对象的状态(state ) —当施加那些方法时,对象如何响应?
  • 对象标识(identity ) —如何辨别具有相同行为与状态的不同对象?
public class Rect_V3 {
    public static void main(String[] args) {
        Rect03 r1 = new Rect03();
        Rect03 r2 = new Rect03();

        //输出对象地址
        System.out.println(r1);
        System.out.println(r2);

        r1.setRect(3, 4);
        r2.setRect(5, 6);
        System.out.println(r1.height);
        System.out.println(r1.width);
        System.out.println(r2.height);
        System.out.println(r2.width);
    }
}

class Rect03{
    public int width;
    public int height;

    public void setRect(int w, int h){
        this.height = h;
        this.width = w;
    }
}

this表示当前对象

  • 当前对象只存在于方法调用之中

3 static关键字

static关键字修饰的属性被称为静态属性或类属性

static关键字修饰的方法被称为静态方法或类方法

  • 类方法的特点是可以使用类直接调用
  • 类方法在调用时没有当前对象,在类方法中不能访问非static的成员
[public] class 类名{
    权限 static 数据类型 属性名;
    权限 static 返回值类型 方法名(){
        方法体;
    }
}
public class StaticKeyword {
    public static void main(String[] args) {
        RectStatic r1 = new RectStatic();
        RectStatic r2 = new RectStatic();

        r1.height = 3;
        r1.width = 4;
        r1.classnum = 1;
        r2.height = 5;
        r2.width = 6;
        r2.classnum = 2;

        System.out.println(r1.classnum);
        System.out.println(r2.classnum);
        System.out.println(RectStatic.classnum);
    }
}

class RectStatic{
    public int width;
    public int height;
    public static int classnum;
}

4 方法重载

在一个类中,可以声明多个方法名相同的方法,但是这些方法要有不同的参数列表。

如果是方法名和参数列表都相同,仅仅有返回值类型不同的情况下不可以重载。

public class FunOverLoad {
    public static void main(String[] args) {
        Rect06 r = new Rect06();

        r.fun1();
        r.fun2(1);
        r.fun3(1, 2);
    }
}
class Rect06{
    public void fun1(){
        System.out.println("this is fun1");
    }
    public void fun2(int x){
        System.out.println("this is fun2");
    }
    public void fun3(int x, int y){
        System.out.println("this is fun3");
    }
}

5 对象的初始化

5.1 属性的初始化

对象中各类变量的默认初始值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54dzL2T6-1672287257487)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221013092728205.png)]

两种属性初始化方式:

  • 声明属性时直接使用等号初始化
  • 使用构造函数初始化

5.2 构造方法

构造方法特点:

  • 是类的成员方法
  • 方法名与类名相同
  • 没有返回值类型
  • 创建对象时自动调用,且只能在创建对象时调用
  • 没有写明构造函数的类会自动生成无参构造函数

5.2.1 无参构造方法

//无参构造方法
public class Constructor_V1 {
    public static void main(String[] args) {
        RectCons_v1 r = new RectCons_v1();

        System.out.println(r.height);
        System.out.println(r.width);
    }
}
class RectCons_v1{
    public int width;
    public int height;

    RectCons_v1(){
        width = 3;
        height = 4;
        System.out.println("调用无参构造函数");
    }
}

5.2.2 有参构造方法

  • 构造函数可以带参数
  • 构造方法支持重载
  • 如果是有参构造方法,创建对象时要为构造方法传参
  • 一旦类中显式的写出构造方法(无论是否有参),那么默认的构造方法都会失效
public class Constructor_V2 {
    public static void main(String[] args) {
        RectCons_v2 r1 = new RectCons_v2();
        RectCons_v2 r2 = new RectCons_v2(5, 6);

        System.out.println(r1.width);
        System.out.println(r1.height);
        System.out.println(r2.width);
        System.out.println(r2.height);
    }
}
class RectCons_v2{
    public int width;
    public int height;

    RectCons_v2(){
        System.out.println("这是无参构造方法");
        width = 3;
        height = 4;
    }
    RectCons_v2(int x, int y){
        System.out.println("这是有参构造方法");
        width = x;
        height = y;
    }
}

    public int width;
    public int height;

    RectCons_v2(){
        System.out.println("这是无参构造方法");
        width = 3;
        height = 4;
    }
    RectCons_v2(int x, int y){
        System.out.println("这是有参构造方法");
        width = x;
        height = y;
    }
}

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

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

相关文章

设备通过发放批量自注册场景体验【玩转华为云】

创建实例 首先,根据提示创建实例 实例名称实例描述 创建成功 可以看到,当前实例已经在运行中了 设备发放 在左侧列表中点击“设备发放” 功能简介 您可以通过“设备发放”轻松管理跨多区域,海量设备的发放工作,实现单点发放管…

.Net WebApi— SwaggerUI配置

最近新公司用了特别老的技术【Web 服务 .asmx文件 做WebService服务】,而WebApi早就流行四五年了; 实在太过于简陋,关键其他系统对接的同事,经常说对接不上,如果接口过多确实不方便接口管理,所以最终决定重…

基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备

文章目录一、前言二、系列文章三、解析:完整源码1. helloworld_amlogic_char_driver.c2. Makefile四、编译执行4.1 编译4.2 执行(1)部署(2)加载ko文件(3)查看结果(4)是否…

android 皮肤包换肤之Resources加载(一)

Android 换肤之资源(Resources)加载(一) 本系列计划3篇: Android 换肤之资源(Resources)加载(一) — 本篇setContentView() / LayoutInflater源码分析(二)换肤框架搭建(三) 看完本篇你可以学会什么? Resources在什么时候被解析并加载的 Application#ResourcesActivity#Reso…

【Python黑帽子】——搭建TCP端口扫描器

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

计算1到n的和(不用循环且逐步限制条件)

目录 一、题目简单描述 二、递归实现 1、if…else… 2、三目运算符 ?: 3、逻辑与操作符 && 三、公式实现 四、C调用构造函数累加法 注:满足题目要求的解法有递归实现的第三种、公式实现、C调用构造函数累加法三种方法、 一、题目简…

死锁的成因以及解决方案

🎈专栏链接:多线程相关知识详解 目录 一.什么是死锁以及死锁的成因 Ⅰ.一个线程一把锁 Ⅱ.两个线程两把锁 Ⅲ.多个线程多把锁 二.死锁的解决方案 一.什么是死锁以及死锁的成因 死锁是一个线程加上锁了之后,解不开了 在多线程编程中,我们为了防止多…

【微服务】3、NACOS 的使用

🔖 Eureka 可以做注册中心【https://github.com/Netflix/eureka】 🔖 但它的功能比较少,仅仅注册中心 🔖 nacos 也可做注册中心,且功能更加丰富【https://nacos.io/】 一、了解 Nacos ✏️ Nacos 是阿里巴巴的产品&am…

【Python】PyQt拖动控件对齐到网格

实现如下需求: 在PyQt界面上有一个控件,实现其可任意拖动,且鼠标释放时自动对齐到网格。 目录1.控件任意拖动并对齐到网格2.进阶:双击控件使其移动到其他网格1.控件任意拖动并对齐到网格 如下按钮(尺寸100100),可任意…

【K3s】第11篇 解决“1 Preemption is not helpful for scheduling”问题

目录 1、遇到问题 2、问题解决 1、遇到问题 sudo kubectl get pods -A sudo kubectl describe pods coredns-b96499967-q5lzw -n kube-system Events: Type Reason Age From Message ---- ------ ---- ---- …

YXC | ADAS自动驾驶四大模块选用晶振有何要求

近几年无人驾驶汽车(ADAS)热度非常高,不少汽企巨头纷纷入局,那么无人驾驶汽车需具备什么硬件设备呢? 自动驾驶汽车依靠人工智能(AI)、视觉计算、监控系统模块、雷达测距系统模块、和GPS全球定位…

SpringBoot 这两个配置文件有什么区别?

本文讲解了关于 SpringBoot 自动装配的两个配置文件spring.factories 和 spring-autoconfigure-metadata.properties有什么区别?点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达读过上一片文章你可能会发现,在自动装…

第二个脚本——自动登录学习通

目录 本篇主要内容: 详细步骤: 第一步:对登入页面进行分析 第二步:模拟点击,表单填写和多边框操作原理介绍 模拟点击 表单填写 操作多选框: 第三步,实现自动登录 完整代码: 本篇主要内…

日百万流量网站励志一生被K

我是卢松松,点点上面的头像,欢迎关注我哦! 曾经每天小百万IP的网站、Z-blog流量最大的网址之一,励志一生这两周被百度K了,流量瞬间没有了,联盟广告收入估计日落千丈。这个网站有多牛可能很多人不清楚&#…

Linux内存管理:NUMA技术详解(非一致内存访问架构)

一.背景 所谓物理内存,就是安装在机器上的,实打实的内存设备(不包括硬件cache),被CPU通过总线访问。在多核系统中,如果物理内存对所有CPU来说没有区别,每个CPU访问内存的方式也一样&#xff0c…

基于springboot+jpa 实现多租户动态切换多数据源 - 使用Flyway实现多数据源数据库脚本管理和迭代更新

多租户动态多数据源系列 1、基于springbootjpa 实现多租户动态切换多数据源 - 数据隔离方案选择分库还是分表 2、基于springbootjpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源 3、基于springbootjpa 实现多租户动态切换多数据源 - 使用Fl…

Kafka Producer Acks机制

Kafka Producer Acks 设置ACK props.put("acks", "all");通过上述代码,配置kafka生产者发送消息后,是否等待Broker的回执信息。在集群环境下,该配置是kafka保证数据不丢的重要的参数之一,今天来学习一下&…

深入理解Elasticsearch分片

了解分片的基本原理,对Elasticsearch性能调优有帮助。 关系梳理 ES底层使用的是Lucene库,ES的分片(shard )是Lucene的索引,ES的索引是分片的集合,Lucene的索引是由多个段(segment)…

青岛OJ如何导入题库详细图示

打开你的后台管理 找到问题位置 增加题目是可以编辑题目,导入数据。 导入导出是用题目和数据直接导入的。 这个ID的话就是题目ID不能设置一样的 然后题目输入输出就都不说了 按照格式就可以了,这里说一下Tag是标签,每次都要设置&#xff…

shell-条件测试

1、编写一个 Shell脚本,程序执行时从键盘读入一个目录名,如果用户输入的目录不存在,则提示file does not exist;如果用户输入的不是目录则提示用户必须输入目录名;如果用户输入的是目录则显示这个目录下所有文件的信息…