首页 > 其他分享 >面向对象的一些知识

面向对象的一些知识

时间:2024-07-20 17:28:36浏览次数:12  
标签:对象 子类 知识 面向对象 一些 抽象类 父类 方法 属性

文章目录

类与对象

类里有什么内容?

​ 一个类中可以有成员方法、静态方法、成员属性、抽象方法、静态属性

类和对象的关系

​ 类是抽象的表示,类中只能有属性和方法

​ 对象是类的具象化,面对对象就是利用类去创造该类的对象,然后用该对象去操作类的属性和方法

对象和引用的关系

Person p = new Person();
//没对象的兄弟有福了,可以在这里new一个,想要什么类型都可以自己new,哈哈哈

​ 对象->new Person(),new出的是对象,对象在堆中开辟空间

​ 引用->p,引用中存储的是对象的地址

对象在哪里开辟空间

​ 方法里的对象如果被返回了,就会在堆里开辟空间,如果没有返回,仅在方法内部使用,则会在栈里开辟

private修饰符 - 私有化

​ 如果修饰属性,则该属性不能在该类以外使用

​ 如果修饰方法,则该方法不能在该类以外使用

this关键字 - 本对象

​ this.属性:在成员方法中调用本对象的属性

​ this.方法:在成员方法中调用本对象的方法

​ this([值]):在构造方法的第一句调用其他的构造方法

注:在静态方法中不能使用this,因为静态方法属于类的方法,直接使用类名调用

封装

​ 概念:将数据和操作数据的方法(即行为)打包在一起,形成一个相对独立的、可复用的软件模块,同时对外部隐藏对象的内部细节和具体实现的过程。

​ 步骤:

​ 1.私有化属性

​ 2.添加get、set方法

问:为什么要使用封装?

​ 属性直接调用会有数据安全的问题,通过添加get、set方法去获取和设置

构造方法

​ 与类名相同且没有返回项的方法叫做构造方法

​ 作用:创建对象、初始化数据(静态属性、成员属性)

static修饰符 - 静态的

​ 1.修饰属性:该属性变为类属性,直接由类名调用

​ 2.修饰方法:该方法变为类方法,直接由类名调用

​ 3.修饰代码块,该代码块变为静态代码块,可以初始化静态属性

继承

​ 子类继承父类所的方法和属性

​ 注:创建子类对象不会创建父类对象,但是会调用父类构造方法,开辟空间存放父类成员属性

优缺点

​ 优点:减少了代码冗余

​ 缺点:增加了程序功能实现的复杂度,增加了类于类之间的关联度

子类能否继承父类所有属性和方法

​ 虽然Java官方的说法是子类不能继承父类的私有化方法和属性,但你可以在父类再写一个公有方法,在公有方法调用父类的私有化属性和方法,然后在子类调用该公有方法

super关键字

​ super.属性:在子类中,调用父类非私有化的成员属性

​ super.方法:在子类中,调用父类非私有化的成员方法

​ super([值]):在子类的构造方法的第一句调用父类非私有化的构造方法

重写/复写

​ 将父类方法在子类重新编写一遍

​ 要求:

​ 1.在子类中重写

​ 2.返回值类型、方法名、参数列表都必须和父类一致

​ 3.访问修饰符不能比父类更严格

访问修饰符

​ private、默认的、protected、public,每个修饰符都有不同权限

​ private:只允许在本类

​ 默认:在本类和本包

​ protected:在本类、本包、其他包的子类

​ public:本类、本包、其他包的子类、其他包

​ 修饰范围:

​ 类:默认的、public

​ 方法、属性:private、默认的、protected、public

Object

​ 所有类的超类,一个方法没有明确继承的父类,那么它默认继承Object类

​ 常用方法:

​ 1.equals:判断两个对象的内存地址是否相同,子类重写该方法即可

​ 2.getClass:获取字节码文件对象,子类重写该方法即可

​ 3.hashCode:获取对象的hash码,在反射中使用

​ 4.toString:获取对象的字符串表示,在获取hash值时使用

final

​ 应用场景:

​ 1.修饰属性:该属性变为常量,存放在常量池中

​ 2.修饰方法:该方法不能被子类重写

​ 3.修饰类:该类不能被继承

抽象类

​ 抽象类是一种不能实例化的类,其目的是为了被继承而设计的。它可以包含抽象方法和具体方法。

​ 特点:

​ 1.抽象类不能直接实例化,只能被子类继承。

​ 2.抽象类可以包含抽象方法和具体方法。

​ 3.子类继承抽象类后,必须实现抽象类中的所有抽象方法,除非子类自身也是抽象类。

​ 4.可以有构造方法,但是不能用来实例化抽象类。

abstract class Animal {
    String name;
	// 抽象方法
	abstract void makeSound();

	// 具体方法
	void eat() {
  	  System.out.println(name + " is eating.");
	}
}

class Dog extends Animal {
    // 实现抽象方法
    void makeSound() {
        System.out.println("Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.name = "Buddy";
        myDog.makeSound();
        myDog.eat();
    }
}

抽象方法

​ 抽象方法是一种声明但不实现的方法,它必须在抽象类中声明(不能在普通类中声明),并且子类必须实现(override)这些方法

​ 特点:

​ 1.没有方法体,以分号结束。

​ 2.子类必须实现所有抽象方法,否则子类也必须声明为抽象类。

abstract class Shape {
    abstract void draw(); // 抽象方法
}

class Circle extends Shape {
    void draw() {
        System.out.println("Drawing Circle");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape = new Circle(); // 合法,子类实现了抽象方法
        shape.draw();
    }
}

接口

​ 特殊的抽象类

  1. 声明方法:接口只能声明方法,而不能实现方法的代码体。所有在接口中声明的方法都是抽象的,不需要加上 abstract 关键字。
  2. 实现接口:一个类可以通过实现(implement)接口来表明它遵循了接口所定义的协议。一个类可以实现多个接口,这种多继承的特性使得接口在某些情况下比抽象类更灵活。
  3. 强制约束:实现接口的类必须实现接口中声明的所有方法,否则会导致编译错误。
  4. 无状态:接口本身不包含任何状态信息(实例变量),只包含行为的声明。
  5. 应用:接口常用于定义模块之间的协议,使得不同模块可以通过接口进行交互而不依赖于具体实现,从而提高了代码的可维护性和扩展性。

多态

​ 指的是同一个方法调用可以在不同的对象上有不同的行为。多态性使得程序可以根据对象所属的类来调用相应的方法,从而实现方法的重用和灵活性的增强。

  1. 方法重写:多态是通过方法重写(Override)来实现的,子类可以重写父类的方法,即在继承关系中,子类可以对父类中的方法进行重新定义。
  2. 编译时类型和运行时类型:在运行时,对象的实际类型决定了调用哪个方法,而在编译时,方法调用会根据声明变量的类型来确定。
  3. 实现方式:多态可以通过继承实现,也可以通过接口实现。在继承中,子类重写父类的方法,从而表现出不同的行为;在接口中,不同的实现类可以实现同一个接口的方法,表现出不同的行为。
  4. 提高灵活性:多态性使得程序可以根据对象的类型动态调用适当的方法,这样在不同情况下可以使用相同的方法名执行不同的操作,从而提高了代码的可复用性和可扩展性。

内部类

​ 在一个类的内部定义另一个类

  1. 成员内部类(Member Inner Class):定义在另一个类的内部,作为该类的成员。它可以访问外部类的所有成员(包括私有成员),并且可以使用 this 关键字引用自身。
  2. 静态内部类(Static Nested Class):定义在另一个类的内部,但使用 static 修饰。静态内部类不持有对外部类对象的引用,因此它只能直接访问外部类的静态成员,而不能访问非静态的外部类成员。
  3. 局部内部类(Local Inner Class):定义在方法内部的类,作用域限定在方法内部。局部内部类可以访问方法的参数和局部变量,但是这些变量必须声明为 final 或是实际上是 final 的(Java 8及以后版本放宽了对变量的限制)。
  4. 匿名内部类(Anonymous Inner Class):是一种没有类名的局部内部类,通常用于创建实现某个接口或是继承某个类的对象,且只使用一次的情况。匿名内部类必须实现接口或继承抽象类,并在定义的同时进行实例化。

若有错误,欢迎指正!

标签:对象,子类,知识,面向对象,一些,抽象类,父类,方法,属性
From: https://blog.csdn.net/nzksk/article/details/140574493

相关文章

  • 深入理解面向对象编程(OOP)
    ......
  • 【网络基础知识】三级跳板技术揭秘:企业如何防范网络“隐形刺客”?
    在一个寂静的夜晚,一家知名科技公司的网络管理员小李突然发现,公司内网的数据流量异常激增,而且似乎有未授权的设备在进行数据传输。小李立即启动了应急响应机制,但奇怪的是,公司的防火墙和入侵检测系统都没有发出任何警报。这究竟是怎么一回事?原来,这一切的幕后黑手正是一种被称为“三......
  • 05. Kubernetes基础篇-Docker知识
    常用命令dockerinfo查看docker信息#客户端信息Client:DockerEngine-CommunityVersion:26.1.4Context:defaultDebugMode:falsePlugins:buildx:DockerBuildx(DockerInc.)Version:v0.14.1Path:/usr/libexec/docker/cli-plu......
  • 网络中一些概率的理解
     路由:将路由比喻为中转站是一个直观的理解方式,但为了更全面地理解路由的功能,我们还可以将其比作网络通信中的邮局或快递分拣中心。在这个类比中:数据包相当于信件或包裹,它们需要从一个地方发送到另一个地方。源地址和目的地址类似于信封上的发件人和收件人的地址。路由器就......
  • numpy的一些基本操作
    文章目录1.numpy数组的多种创建方式1.1使用np.array()创建1.2使用plt创建1.3使用np的routine函数创建2.numpy的常用属性2.1shape2.2ndim2.3size2.4dtype3.numpy的索引和切片3.1切出前两列数据3.2切出前两行数据3.3切出前两行的前两列的数据3.4数组数据翻转3.5练习:将一......
  • c++零基础知识要点整理(5)
    1.位与运算符:& (位与:代表把二进制的每个数的每一位从低到高进行运算(有0必0))逻辑与:&&(有假必假)(1)位与的定义:inta=0b1001;//0b1001是二进制表示法,0b代表用二进制表示,0b1001对应十进制数为:9intb=0b0101;//对应十进制数为:5a&b=0b0001;//12.位或运算符:| (有1即1)逻辑或:||......
  • 预处理知识库文件
    在载入知识库文件的时候,直接上传文档虽然能实现基础的问答,但是,其效果并不能发挥到最佳水平。因此,我们建议开发者对知识库文件做出以下的预处理。以下方式的预处理如果执行了,有概率提升模型的召回率。1.使用TXT/Markdown 等格式化文件,并按照要点排版例如,以下段落应该被处......
  • 【网络知识系列】被动防御•主动防御•积极防御
    网络安全建设中,经常提到一些方法论,比如网络安全滑动标尺模型,叠加式提升网络安全能力。日常工作中,也提及主动防御,但主动防御和积极防御的边界在哪❓被动防御被动防御是指在网络安全受到攻击时,采取一些安全措施来保护系统免受攻击。被动防御,也称消极防御,是通过堆砌防火墙、入......
  • FreeRTOS【面试】实时操作系统的知识总结
    RTOS的实时性是如何实现的?任务之间是如何通信的?二值信号量与互斥信号量的区别?优先级反转?如何解决优先级反转问题?任务通知是怎么实现的?框架性的回答一个嵌入式系统Freertos的启动到结束的过程?任务切换的原理? 除了任务切换对freertos其他底层了解吗?讲讲FreeRT......
  • 前端必修技能:高手进阶核心知识分享 - CSS伪类和伪元素
    前端必修技能:高手进阶核心知识分享-CSS伪类和伪元素前端必修技能:高手进阶核心知识分享-CSS伪类和伪元素在前端的工作中,经常会遇到伪类和伪元素,但很多人(包括我自己)都没有仔细的去分辨它们,归其原因,大概是因为:写法相似。但其实,伪类和伪元素还是有很多不同的。温......