计算机基础知识——面向对象:封装+继承+多态整理

在这里插入图片描述

面向对象三大特性:封装、继承、多态。

1.封装

将一系列相关事物的共同的属性和行为提取出来,放到一个类中,同时隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
【JavaBean类就可以看作是封装的完美案例。】

setter和getter

其实指的分别是setXxx和getXxx两个函数。setXxx可以修改对应属性的值,而getXxx则可以获取对应属性的值。
他俩能给private属性赋值个取值。

this

每一个创建的对象都有一个this属性,指向该对象本身(类似于指针,但在Java中叫做引用)
1.用法:
①this.属性名; (可调用当前对象的属性,this.属性名就是当前对象的属性)
②this.方法名(参数); (可调用当前对象的方法)
③知识延申 :
PS : this(参数列表) 可以访问本类的构造器。但要注意:Δ此时this后不需要加"."。Δ该途径只能在构造器中使用,且使用时必须置于构造器的首句。我们称之为“构造器的复用”。
可以解决形参名与属性名的重名问题。

package knowledge.define;public class Phone {
//成员变量:private int age;  //this 关键字对于属性的应用:public void pintAge () {int age = 10;System.out.println("1:" + age);System.out.println("2:" + this.age);}
}public class
TestPhone {public static void main(String[] args) {
//1.创建对象Phone p = new Phone();
//2.调用成员方法p.pintAge();}
}

1:10
2:0
因为this.age没有setAge赋值,整型默认值为0

构造器

构造器,也叫构造方法,指用来帮助创建对象的方法,但仅是帮助。它不是用来创建新对象的,而是完成对新对象的初始化
实际上是:new关键字来创建对象,并在堆内存中开辟空间,然后使用构造器完成对象的初始化。
1.构造器需要满足的要求:
构造方法名必须与类名相同!(包括大小写)
构造方法没有返回值!(但是也可以在方法内部写一个return)
2.当类中没有定义任何构造器时,该类默认隐含一个无参构造。这也是为什么我们之前写过的类中没有定义构造器,却依然可以创建该类的对象,因为系统默认给出了无参构造,所以就会以默认的无参构造对新对象进行初始化
3.构造器可以重载,就和方法一样,同一个类中可以定义多个构造器。
4.构造器是在执行new关键字的时候,由系统来完成的,即在创建对象时,系统会自动匹配并调用该类的某个构造器完成对对象的初始化。
构造器示例:

public class Phone {private int age = 11;//公有的空参构造   (重点)public Phone() {System.out.println("这是空参构造,成功调用此构造时打印这句话");}public Phone(int age) {System.out.println("这句话打印出来,说明带参构造被成功调用");this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class TestKunKun {public static void main(String[] args) {//调用有参构造Phone phone1 = new Phone(18);//调用无参构造Phone phone2 = new Phone();}
}

2.继承

Java中继承的特点:
1.仅支持单继承。每个类最多有且只能继承一个类,不能同时继承多个类。但是,Java支持多层继承。 多层继承指当父类衍生出一个子类后,该子类可以作为父类继续衍生出它的子类.
2.父类私有成员子类无法继承。发生继承关系后,子类拥有了父类的非私有成员。
3.父类构造器子类不能继承。构造器用于初始化对象。父类构造器用于初始化父类对象,子类构造器用于初始化子类对象。

super关键字

1.类似于this关键字,super关键字也是一个指针,当然了,在Java中叫做引用。
this是一个指向当前对象的引用。而super则是指向当前对象父类的引用(即父类内容内存空间的标识)。
当new关键字创建子类对象时,子类对象的堆空间中会有一部分用于存放父类的内容,即继承自父类的非私有成员。super就指向这么一部分。可以理解为,super指向的部分是在this指向的部分的范围内。在使用时,this从本类开始找,super从父类开始找。
2.直接访问父类变量的方式 : super.父类变量名 (仅能访问非私有属性,所以是直接访问)
3. new关键字创建对象后,对象初始化顺序:
先初始化父类内容,再初始化子类内容。(原因是创建子类对象时,优先调用父类的构造器
4.java中查找变量的顺序:
在这里插入图片描述
5. this关键字解决了局部变量和本类成员变量的命名冲突问题。this关键字使得我们可以在局部变量存在的情况下,避开Java就近原则的约束,在局部位置使用成员变量。
super关键字,就是从父类开始找,在局部位置使用父类成员变量。

继承关系中构造器的使用

继承设计中的基本思想 : 父类的构造器初始化父类内容,子类的构造器初始化子类内容。
(1)创建子类对象时,优先调用父类的构造器。
(2)子类构造器的第一行,默认隐含语句super(); 用于调用父类的默认无参构造。
(3)当父类有参无参都有,子类构造器的使用情况 : 无参对无参,有参对有参。即,在子类无参构造中通过“super();” 调用父类的无参构造;在子类有参构造中通过“super(参数);” 调用父类的有参构造。

方法重写

重写必须满足返回值类型、方法名,参数列表都相同!即——外壳不变,内部重写。
可以用@Override注解来标注。
①父类私有方法不能被重写。
②子类方法访问权限不能小于父类方法,即访问权限 : 子类 ≥ 父类。(本文后面我们就会讲到Java四大访问修饰符)
③子类不能比父类抛出更大的异常
方法重写和方法重载的区别 :
重载:是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。重载是在一个类中。
重写:是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。重写是子类与父类之间。
图片来自https://blog.csdn.net/TYRA9/article/details/128523078

Java四大访问权限修饰符 :

访问权限修饰符指的是用来修饰成员变量,成员方法和类,来确定它们的访问权限的。
分别是private、默认、protected,public。
private修饰的成员只能在本类使用。
public修饰的成员可以被所有类使用。
默认修饰符,指的就是没写修饰符。默认修饰符修饰的成员允许在当前所在包下其他类使用。
protected修饰符修饰的成员除了可以在本包下使用,在其子类中也可以使用。
四大修饰符按照根据访问权限从小到大的原则依次是 : private < 默认 < protected < public。

延申(关于类和源文件的关系) :
①一个Java源文件中可以定义多个类,源文件的基本组成部分是类。
②源文件中定义的类,最多只能有一个类被public修饰,其他类的个数不限。
③如果源文件中有被public修饰的类,那么源文件名必须与该类类名保持一致
④如果源文件中没有被public修饰的类,那么源文件名只要符合命名规范就可以。
⑤main函数不一定非得写在public修饰的类中,也可以将main函数写在非public修饰的类中,然后通过指定运行非public类,这样入口方法就是非public类的main方法。
————————————————
部分内容摘自:https://blog.csdn.net/TYRA9/article/details/128523078

3.多态

多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。

条件

在Java中要实现多态,必须要满足如下几个条件,缺一不可:
1.必须在继承体系下
2.子类必须要对父类方法进行重写
3.通过父类的引用调用重写的方法

向上转型和向下转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式:父类类型 对象名 = new 子类类型()
(1)直接赋值

Parent c = new Child();

(2)方法的参数,传参的时候进行向上转型

    public static void fun(Parent p){//...}

(3)返回值转型

    public static Child fun1(){Child c = new Child();return c;}

向下转型:将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。
注:向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。

重写

外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

方法重写的规则:

1.返回值类型,方法名 ,参数列表 必须是一样的(返回值是父子关系,可以构成重写叫协变)
2.被重写的方法的访问修饰限定符在子类中要大于父类的
3.被private修饰的方法是不可以被重写的
4.被static修饰的方法是不可以被重写的
5.被final修饰的方法是不可以被重写的

6.构造方法不能被重写的

final关键字

final:最终的、不可改变的。可用于修饰类、方法、变量。
类:被修饰的类,不能被继承
方法:被修饰的方法,不能被重写
变量:被修饰的变量,有且只能被赋值一次

public final class String 、public final class Math 、public final class Scanner 等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
1.修饰变量-成员变量
成员变量如果被final修饰,一旦有了初始值 就不能被重新赋值。

由于成员变量具有默认值,用final关键字修饰后 不会再给默认值,必须手动赋值,否则会报错。
因此必须手动初始化,有两种初始化方式——显示初始化和构造方法初始化。
(1)直接赋值

public class Person {private final String name = "Jenny";
}

(2)构造方法赋值

public class Person {//对于final类型的成员变量,有两种初始化方式(赋值方式),显示初始化和构造方法初始化,只能选其中一个// 定义成员变量时指定默认值,合法。final String name = "Jenny";final int num;public Person() {// 在构造器中分配初始值num = 20;}public Person(int num) {// 在构造器中分配初始值this.num = num;}
}

static关键字

static是静态的意思,可用来修饰 成员方法、成员变量。static修饰后的变量、方法,可以被类的所有对象共享
static修饰成员变量之后,这个变量被称为类变量或静态成员变量;无static修饰的成员变量是属于每个对象的,这个变量被称为实例变量
static修饰方法之后,这个方法被称为类方法或静态方法;无static修饰的成员方法是属于每个对象的,这个成员方法也叫做实例方法

推荐以 对象.静态成员变量类名.静态方法的形式来访问

public class Employee {//静态成员变量,属于类,只有一份public static String companyName = "abc";   public static void work() {System.out.println("我们都在" + companyName + "公司工作");}//实例变量private String name;private Integer age;public void achive() {System.out.println(name + "实现大成就");}
}public static void main(String[] args) {System.out.println(Employee.companyName); //abcEmployee.companyName = "learn"; //直接用类来访问System.out.println(Employee.companyName);  //learnEmployee.work(); //直接用类来访问Employee employee1 = new Employee("zhangsan", 18);//实例化对象来访问System.out.println(employee1.getAge()); //18employee1.achive();//对象来访问
}

注:
(1)静态方法只能访问静态成员。不能直接访问实例成员
若想要使用静态方法调用非静态方法,只需要实例化new一个类对象,此时jvm虚拟机就会为对象开辟一块内存,该类的所有方法也随之被存储到内存当中。此时静态方法和非静态方法都在内存当中,所以在静态方法中可以使用对象去调用一个非静态方法。
(2)实例方法可以访问静态成员,也可以访问实例成员
(3)静态方法中是不可以出现this关键字的。this指当前对象,静态方法中不用声明实例对象

在java中,程序执行时 类的字节码文件会被加载到内存中,如果类没有创建对象 类的成员变量则不会分配到内存;
但对于被static修饰的静态变量/方法,堆中有一个专属的静态变量区,当JVM虚拟机将字节码加载到内存时,会为静态变量/方法在堆中分配出一段空间用于放置值,即静态变量/方法跟随类加载而加载

抽象类

1.抽象类概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
我们可以把它设计成一个 抽象方法(abstractmethod), 包含抽象方法的类我们称为 抽象类(abstract class)

2.抽象类语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

abstract class A{abstract void  fun();
}class B extends A{void  fun(){System.out.println("B fun");}

注意:抽象类也是类,内部可以包含普通方法属性,甚至构造方法

3.抽象类特性
1.使用abstract修饰的方法称为抽象方法
2.使用abstract修饰的类称为抽象类
3.抽象类是不可以实例化的
4.抽象类当中可以和普通类一样定义成员变量和成员方法
5.当一个普通的类继承这个抽象类,那么需要重这个抽象类当中的所有的抽象方法!!!
6.抽象类的出现就是为了被继承!!!
7.abstract 和final不能共存
8.被private static 修饰的抽象方法也是不可以的

接口

接口
1.接口的概念
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成interface关键字,就定义了一个接口。

public interface 接口名称{// 抽象方法public abstract void method1(); // public abstract 是固定搭配,可以不写public void method2();abstract void method3();void method4();// 注意:在接口中上述写法都是抽象方法,跟推荐method4,代码更简洁
}

3.接口使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法

public class 类名称 implements 接口名称{
// ...
}
// USB接口
public interface USB {void openDevice();void closeDevice();
}
// 鼠标类,实现USB接口
public class Mouse implements USB {//实现接口@Overridepublic void openDevice() {//实现方法System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("鼠标点击");}
}

4.接口特性
(1).接口当中不能有被实现的方法,意味着只能有抽象方法两个方法除外:一个是static修饰的方法一个是被default修饰的方法.
(2).接口当中的抽象方法,默认都是public abstract修饰的
(3).接口当中的成员变量,默认都是public static final修饰的
(4).接口不能进行实例化

原文链接:https://blog.csdn.net/weixin_66484088/article/details/135323441
5. 在Java中,类和类之间是单继承的,但是一个类可以实现多个接口接口与接口之间可以多继承

interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}

6.抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题).
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写),
而接口中不能包含普通方法, 子类必须重写所有的抽象方法.
7.Object类
Object是默认类,除Object类外所有的类都有继承关系,默认继承Object类。所以可以直接使用Object的方法(当然有些需要重写方法)。
比如使用Object类中的equals

对象比较equals方法
a.如果左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:

class Preson{ // 默认继承Object类String name;int age;public Preson(String name, int age) {this.name = name;this.age = age;}}
public static void main(String[] args) {Preson  a = new Preson("张三",18);Preson  b = new Preson("张三",18);System.out.println(a.equals(b));}

没有重写就是两个类对象比较地址是否相同,为False
重写:后就是True

    @Overridepublic boolean equals(Object obj) {Preson b = (Preson) obj;return this.age==b.age&&this.name.equals(b.name);}

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

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

相关文章

云动态摘要 2024-06-25

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新产品更新 Web应用防火墙 - 验证码支持微信小程序接入 阿里云 2024-06-25 支持客户从微信小程序场景下接入&#xff0c;提供人机识别的安全防护。 工业数字模型驱动引擎 - iDME控制台换新升级 华为云…

[20] Opencv_CUDA应用之 关键点检测器和描述符

Opencv_CUDA应用之 关键点检测器和描述符 本节中会介绍找到局部特征的各种方法&#xff0c;也被称为关键点检测器关键点(key-point)是表征图像的特征点&#xff0c;可用于准确定义对象 1. 加速段测试特征功能检测器 FAST算法用于检测角点作为图像的关键点&#xff0c;通过对…

轻松掌握:工科生如何高效阅读国际期刊和撰写论文(上)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

七天速通javaSE:第三天 程序控制结构:练习题

文章目录 前言一、基础1.计算从0~100之间奇数之和和偶数之和2. 用for循环输出0~1000之间能被5整除的数&#xff0c;每行输出三个 二、进阶1. 九九乘法表2.等边三角形 前言 本文主要讲解三种基本程序控制结构的练习题&#xff0c;以期熟练掌握顺序、选择、循环三种基本结构 一、…

怎么用Python接口发送推广短信

群发短信平台推广&#xff0c;有不少优点。其中通过正规106运营商平台推送&#xff0c;信息更加正规性。尤其是对接接口短信&#xff0c;比如验证码之类的&#xff0c;个人手机号码下发的验证码一般都不靠谱。 支持点对点一对一群发&#xff0c;方便工资条、物业通知等变量信息…

Android开发系列(十)Jetpack Compose之Card

Card是一种常用的UI组件&#xff0c;用于显示一个具有卡片样式的容器。Card组件通常用于显示列表项、卡片式布局或任何需要显示边框和阴影的UI元素。 使用Card组件&#xff0c;您可以轻松地创建带有卡片效果的UI元素。以下是一些Card组件的常见属性和功能&#xff1a; elevati…

YOLOv5改进(七)--改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU

文章目录 1、前言2、损失函数代码实现2.1、修改metrics.py2.2、修改loss.py 3、替换EIOU4、替换SIoU5、替换Alpha-IoU6、替换Focal-EIOU7、目标检测系列文章 1、前言 YOLOv5默认使用损失函数为CIoU&#xff0c;本文主要针对损失函数进行修改&#xff0c;主要将bbox_iou函数进行…

云渲染农场使用指南:如何以最低成本享受最快渲染速度?

​云渲染农场怎么低成本享受快速渲染&#xff1f; 云渲染农场利用其分布式计算能力&#xff0c;为视觉艺术家提供了一种经济高效的渲染选择。它特别适用于高质量的影视动画和视觉效果制作。下面一起来看看如何以最低的成本实现快速渲染的策略。 在追求成本效益的同时&#xff…

第一百二十七节 Java面向对象设计 - Java枚举方法

Java面向对象设计 - Java枚举方法 因为枚举类型实际上是一个类类型&#xff0c;所以我们可以在枚举类型体中声明一切&#xff0c;我们可以在类体中声明它。 以下代码使用字段&#xff0c;构造函数和方法定义了一个级别枚举。 public enum Level {LOW(30), MEDIUM(15), HIGH(7…

2024年好用的加密工具,迅软DSE加密系统原来这么强大

加密软件具有灵活的加密方式和用户友好的操作界面&#xff0c;可定制个性化的安全方案&#xff0c;同时支持数据备份和恢复功能&#xff0c;确保数据的完整性和可用性&#xff0c;是保护数据安全、维护商业机密、防范信息泄露的重要工具。 2024好用的加密工具是哪个&#xff1f…

【SpringCloud-Seata客户端源码分析01】

文章目录 启动seata客户端1.导入依赖2.自动装配 发送请求的核心方法客户端开启事务的核心流程服务端分布式事务的处理机制 启动seata客户端 1.导入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent…

【DS Solutions】一个反欺诈产品的进化,Stripe Radar

Stripe Radar 是 Stripe 提供的一项防欺诈服务&#xff0c;它利用机器学习技术来帮助商家检测和阻止信用卡欺诈行为。这篇文章是Stripe公司关于其反欺诈解决方案Stripe Radar的构建过程的介绍。文章从Stripe的防欺诈团队工程师的角度出发&#xff0c;详细讲述了Stripe Radar的工…

车辆数据的提取、定位和融合 精确车辆定位(其三.一 共十二篇)随机复合

第一篇&#xff1a; System Introduction 第二篇&#xff1a;State of the Art 第三篇&#xff1a;localization 第四篇&#xff1a;Submapping and temporal weighting 第五篇&#xff1a;Mapping of Point-shaped landmark data 第六篇&#xff1a;Clustering of landma…

礼让,不是一昧地退让,而是表达我们的素养、品德

礼 / 让&#xff0c;发心是文明相处&#xff0c;互助互让&#xff0c;是君子之交

UnityShader SDF有向距离场简单实现

UnityShader SDF有向距离场简单实现 前言项目场景布置连连看画一个圆复制一个圆计算修改shader参数 鸣谢 前言 突然看到B站的一个教程&#xff0c;还不错&#xff0c;记录一下 项目 场景布置 使用ASE连连看&#xff0c;所以先要导入Amplify Shader Editor 连连看 画一个…

面试-JMM的内存可见性

1.JAVA内存模型 分析&#xff1a; 由于JVM运行程序的实体是线程&#xff0c;而每个线程创建时&#xff0c;JVM都会 为其创建一个工作内存(栈空间),用于存储线程私有的数据。而java内存模型中规定所有变量都存储在主内存中。主内存是共享内存区域&#xff0c;所有线程都可以访问…

Python-PDF文件密码破解小工具

背景 经常从网络上下载的PDF笔记被加了密&#xff0c;在自己学习的过程中想要添加书签却因为没有密码无法添加&#xff0c;所以通过Python实现一个解密小工具&#xff0c;亲测大多数密码都可以破解。 代码 import os import tkinter as tk from tkinter import filedialog #…

你还不知道Modbus RTU???

1. 什么是Modbus RTU Modbus RTU&#xff08;Remote Terminal Unit&#xff09;是Modbus通信协议的一种变种&#xff0c;用于串行通信。它是一种常见的工业控制系统通信协议&#xff0c;通常用于采集传感器数据、控制执行器和监控设备状态。Modbus RTU采用二进制编码&#xff0…

【深度学习】实现基于MNIST数据集的TensorFlow/Keras深度学习案例

基于TensorFlow/Keras的深度学习案例 实现基于MNIST数据集的TensorFlow/Keras深度学习案例0. 什么是深度学习&#xff1f;1. TensorFlow简介2. Keras简介3. 安装TensorFlow前的注意事项4. 安装Anaconda3及搭建TensorFlow环境1&#xff09; 下载安装Anaconda Navigator2&#xf…

go语言day06 数组 切片

数组 : 定长且元素类型一致,在索引逻辑上连续存储,数组的内存地址是存储的第一个元素的内存地址 几种创建方式: 仅声明 var nums [ 3 ] int 声明并赋值 var nums [ 2 ] string {"武沛齐","alex"} 声明并按下标赋值 var nums [ 3 ] int {0:88,2:1 } 省略…