Java面向对象

1. 对象简介

万物皆对象,而类可以理解为是对某一类事物的描述或者说对象的模板。

实例化出来的对象的实际数据存储在堆内存中,变量只是在栈内存中存储了对象实际数据在堆内存中的地址,所以当多个对象变量指向同一个对象实际数据时,修改其中一个对象变量,也会影响其他变量的值。

2. this关键字

this就是一个变量,指向当前类的对象,哪一个对象中的方法用到this,this指向的就是哪个对象。

3. 构造器(构造方法)

构造方法是一种特殊的方法,没有返回值,方法名必须和类名相同。

构造方法是一种用于创建对象的方法,例如 new Student() 就是在执行构造方法去创建对象。

构造方法注意事项:

  • 在设计一个类时,如果不写构造方法,Java自动生成一个无参的构造方法。
  • 如果自己定义了有参构造方法,Java将不再生成无参的构造方法,需要的话需要自己写。

4. 封装性

面向对象的核心点就是封装,将数据和数据的处理方式,都封装到对象中。

封装的设计规范:合理隐藏、合理暴露

体现在代码中就是将不想让外界直接访问的变量使用private修饰,被private修饰的变量或者方法只能在本类中被访问。

如果想获取或设置被private修饰的变量,就得调用对外暴露(public修饰)的set/get方法,在这个方法中可以对调用者传过来的数据进行一些控制,更加安全。代码示例如下:

// 学生类
class Student{private String name;public void setName(String name){this.name = name;}public String getName(){return name;}
}public class Test01 {public static void main(String[] args) {Student stu = new Student();stu.setName("张三");System.out.println(stu.getName());}
}

5. 实体类JavaBean

实体类就是一种特殊的类,它满足下面的要求:

  • 类中的成员变量都要私有,并且要对外提供相应的getXxx、setXxx方法
  • 类中必须要有一个公共的无参构造器

JavaBean实体类仅仅是用来封装数据的,只提供对数据进行存取的方法。

应用场景:例如实体类可以作为MyBatis查询数据库时的数据返回类型,用于接收从数据库中查询到的数据。

6. 静态(static)

可以用来修饰成员变量,也可以用来修饰成员方法。

6.1 static修饰成员变量

Java中的成员变量按照有无static修饰分为两种:类变量、实例变量。它们的区别如下:

  • 类变量:有static修饰,属于类,在计算机中只有一份,被类的全部对象共享
  • 实例变量(对象的变量):无static修饰,是属于每个对象的

由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量

实例变量是属于对象的,需要通过对象才能调用:对象.实例变量

6.2 static修饰成员方法

成员方法根据有无static也分为两类:类方法、实例方法

有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。

无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。

类方法是随着类的加载而加载的,而实例变量、实例方法是随着对象的创建而产生的,所以不能在static修饰的类方法中调用实例方法或使用实例变量。

6.3 static应用(代码块)

代码块根据有无static修饰分为两种:静态代码块实例代码块

静态代码块:

  • 格式:static{}
  • 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
  • 作用:完成类的初始化,例如:对类变量的赋值。

实例代码块:

  • 格式:{}
  • 特点:每次创建对象时,执行实例代码块,并在构造器前执行。
  • 作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。

7. 工具类

如果一个类中的方法全都是静态的,那么这个类中的方法就全都可以被类名直接调用,由于调用起来非常方便,就像一个工具箱,所以把这样的类就叫做工具类。

8. 继承

Java中提供了一个关键字extends,使用这个关键字,可以让一个类和另一个类建立起父子关系。

public class A extends B{    // A继承了B,B称为父类,A称为子类。}

继承的特点

  • 子类能够继承父类的非私有成员(成员变量、成员方法)
  • Java语言只支持单继承,不支持多继承,但是可以多层继承。

继承后对象的创建

  • 子类的对象是由子类、父类共同完成的。

继承的好处

  • 减少重复代码的编写,提高代码的复用性。
  • 同时也方便了代码的管理,当需要修改某个公共的属性名时,直接在父类中修改一下即可。

9. 权限修饰符

什么是权限修饰符呢?

  • 权限修饰符是用来限制类的成员(成员变量、成员方法、构造器...)能够被访问的范围

缺省就是default

10. 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

在使用子类调用方法时,遵循就近原则,即如果子类中有相应的可调用方法就调用子类的,如果子类没有就调用父类中相应的方法。可通过super关键字指定要调用父类的成员变量或者方法,如super.name、super.toString()等。

11. this和super的用法总结

访问本类成员

  •     this.成员变量    //访问本类成员变量
  •     this.成员方法    //调用本类成员方法
  •     this()           //调用本类空参数构造器
  •     this(参数)      //调用本类有参数构造器

    
访问父类成员

  •     super.成员变量    //访问父类成员变量
  •     super.成员方法    //调用父类成员方法
  •     super()           //调用父类空参数构造器
  •     super(参数)      //调用父类有参数构造器

    
注意:this和super访问构造方法,只能用到构造方法的第一句,否则会报错。

12. 多态

什么是多态?

        多态是在继承、实现情况下的一种现象,表现为:对象多态、行为多态。

        简单来说,即两个子类继承同一个父类,然后两个子类对父类的某个方法做了重写,然后当我们调用这个被重写的方法时,不同的子类就会有不同的表现。

13. final关键字

final关键字是最终的意思,可以修饰类、修饰方法、修饰变量。

  • final修饰类:该类称为最终类,特点是不能被继承。
  • final修饰方法:该方法称之为最终方法,特点是不能被重写。
  • final修饰变量:该变量只能被赋值一次。

在实际运用当中经常使用final来定义常量,什么是Java中的常量呢?

  • 被 static final 修饰的成员变量,称之为常量。
  • 通常用于记录系统的配置信息

14. 抽象类

在Java中有一个关键字叫abstract,它就是抽象的意思,它可以修饰类也可以修饰方法。

  • 被abstract修饰的类,就是抽象类
  • 被abstract修饰的方法,就是抽象方法(不允许有方法体)

抽象类的特点:

  • 不能通过抽象类去创建对象。
  • 可以作为父类让子类去继承,而且子类继承抽象的父类时必须实现抽象父类的所有抽象方法。
  • 子类继承父类如果不复写父类的抽象方法,要想不出错,这个子类也必须是抽象类

抽象类可以解决多个子类有相同代码的问题:

  • 第1步:定义一个抽象类,把子类中相同的代码写成一个模板方法。
  • 第2步:把模板方法中不能确定的代码写成抽象方法,并在模板方法中调用。
  • 第3步:子类继承抽象类,只需要重写父类抽象方法就可以了。

15. 接口

什么是接口?

  • 接口只能包含成员变量和抽象方法。
  • 接口是用来被类实现(implements)的,我们称之为实现类。
  • 一个类是可以实现多个接口的(接口可以理解成干爹),类实现接口必须重写所有接口的全部抽象方法,否则这个类也必须是抽象类。

接口到底有什么好处呢?主要有下面的两点

  • 弥补了类单继承的不足,一个类同时可以实现多个接口。
  • 让程序可以面向接口编程,这样程序员可以灵活方便的切换各种业务实现。

15.1 接口JDK8的新特性

从JDK8开始,接口中新增的三种方法形式。我们看一下这三种方法分别有什么特点?

public interface A {/*** 1、默认方法:必须使用default修饰,默认会被public修饰* 实例方法:对象的方法,必须使用实现类的对象来访问。*/default void test1(){System.out.println("===默认方法==");test2();}/*** 2、私有方法:必须使用private修饰。(JDK 9开始才支持的)*   实例方法:对象的方法。*/private void test2(){System.out.println("===私有方法==");}/*** 3、静态方法:必须使用static修饰,默认会被public修饰*/static void test3(){System.out.println("==静态方法==");}void test4();void test5();default void test6(){}
}

接下来我们写一个B类,实现A接口。B类作为A接口的实现类,只需要重写抽象方法就可以了,对于默认方法不需要子类重写。代码如下:

public class B implements A{@Overridepublic void test4() {}@Overridepublic void test5() {}
}

最后,写一个测试类,观察接口中的三种方法,是如何调用的

public class Test {public static void main(String[] args) {// 目标:掌握接口新增的三种方法形式B b = new B();b.test1();	//默认方法使用对象调用// b.test2();	//A接口中的私有方法,B类调用不了A.test3();	//静态方法,使用接口名调用}
}

在多实现、继承和实现并存时,有可能出现方法名冲突的问题,需要了解怎么解决:

  1. 一个接口继承多个接口,如果多个接口中存在相同的方法声明,则此时不支持多继承
  2. 一个类实现多个接口,如果多个接口中存在相同的方法声明,则此时不支持多实现
  3. 一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会有限使用父类的方法
  4. 一个类实现类多个接口,多个接口中有同名的默认方法,则这个类必须重写该方法。

16. 匿名内部类

匿名内部类本质上是一个没有名字的子类对象、或者接口的实现类对象。

下面就是匿名内部类的格式:

new 父类/接口(参数值){@Override重写父类/接口的方法;
}

比如,先定义一个Animal抽象类,里面定义一个cry()方法,表示所有的动物有叫的行为,但是因为动物还不具体,cry()这个行为并不能具体化,所以写成抽象方法。

public abstract class Animal{public abstract void cry();
}

接下来,我想要在不定义子类的情况下创建Animal的子类对象,就可以使用匿名内部类

public class Test{public static void main(String[] args){//这里后面new 的部分,其实就是一个Animal的子类对象//这里隐含的有多态的特性: Animal a = Animal子类对象;Animal a = new Animal(){@Overridepublic void cry(){System.out.println("猫喵喵喵的叫~~~");}}a.eat(); //直线上面重写的cry()方法}
}

匿名内部类的作用:简化了创建子类对象、实现类对象的书写格式。

17. 枚举

更新中...

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

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

相关文章

打开谷歌浏览器远程调试功能

谷歌浏览器远程调试功能 首先我们来启动Chrome的远程调试端口。你需要找到Chrome的安装位置,在Chrome的地址栏输入chrome://version就能找到Chrome的安装路径 开启远程控制命令 文件路径/chrome.exe --remote-debugging-port9222开启后的样子(注意要关闭其他谷歌浏…

python学习2之sublime text编辑器安装配置使用

1、在windows系统中使用sublime text 下载地址 https://www.sublimetext.com/3 2、在sublime text中运行python程序 代码运行可选择菜单Tools->Build或者按CtrlB 3、定制sublime text的设置 3.1将制表符转换为空格 选择菜单view->indentation,核实选择了复选框indent u…

QT6为工程添加资源文件,并在ui界面引用

以添加图片资源为例 右键工程名字(不是最上面的名字),点击添加现有文件 这种方式虽然添加到了工程中,但不能在UI设计界面完成引用。主要原因可能是未把文件放入到项目资源文件中,以下面一种方式可以看出区别。 点击添…

深入了解Nginx:高性能的开源Web服务器与反向代理

一、Nginx是什么 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,也可以作为负载均衡器和HTTP缓存服务器使用。它采用事件驱动、异步非阻塞的处理方式,能够处理大量并发连接和高流量负载&#xff…

如何使用CSS实现一个带有动画效果的进度条?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML 结构:⭐ CSS 样式:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那…

Tomcat安装及基本使用

1. 什么是Web服务器 Web服务器是一种应用程序(软件),它封装了对HTTP协议的操作,使得开发人员无需直接操作协议,从而简化了Web开发。其主要功能是提供网上信息浏览服务。 Web服务器安装在服务器端,我们可以…

电商系统架构设计系列(十):怎么能避免写出慢SQL?

上篇文章中,我给你留了一个思考题:怎么能避免写出慢SQL? 我们知道,一个慢 SQL 就可以直接让 MySQL 瘫痪。以我个人经验总结来看,一般情况下系统出问题,大多数都是因为SQL语句的问题。掌握和用好了SQL&…

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…

RV64和ARM64栈结构差异

RV64和ARM64栈结构差异 1 RV64和ARM64栈结构差异示意图1.1 RV64和ARM64寄存器介绍1.1.1 RV64寄存器1.1.2 ARM64寄存器 1.2 RV64和ARM64栈结构差异示意图 2 RV64和ARM64栈使用示例2.1 测试的程序2.2 RV64反汇编的汇编程序2.3 ARM64反汇编的汇编程序2.4 RV64和ARM64测试程序的栈结…

数据结构day06(单向循环链表、双向链表)

双向链表的练习代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int database; typedef struct double_link_list{union{database data;int len;};struct double_link_list* pre;…

机器学习笔记之核函数再回首:Nadarya-Watson核回归python手写示例

机器学习笔记之核函数再回首——Nadaraya-Watson核回归手写示例 引言回顾&#xff1a; Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归通过核函数描述样本之间的关联关系使用 Softmax \text{Softmax} Softmax函数对权重进行划分将权重与相应标签执行加权运算 N…

python matlab 画柱状图

函数&#xff1a; bar(x, height, width0.8, bottomNone, *, aligncenter,dataNone, **kwargs) 设置坐标的刻度(ticks)&#xff0c;轴的标签和标题 在数据分析的很多时候&#xff0c;我们各个柱下面通常不是x刻度值&#xff0c;而是有实际意义的字符串&#xff0c;那么这个时…

TensorFlow-slim包进行图像数据集分类---具体流程

TensorFlow中slim包的具体用法 1、训练脚本文件&#xff08;该文件包含数据下载打包、模型训练&#xff0c;模型评估流程&#xff09;3、模型训练1、数据集相关模块&#xff1a;2、设置网络模型模块3、数据预处理模块4、定义损失loss5、定义优化器模块 本次使用的TensorFlow版本…

延迟队列的理解与使用

目录 一、场景引入 二、延迟队列的三种场景 1、TTL对队列进行延迟 2、创建通用延时消息对消息延迟 3、使用rabbitmq的延时队列插件 x-delayed-message使用 父pom文件 pom文件 配置文件 config 生产者 消费者 结果 一、场景引入 我们知道可以通过TTL来对队列进行设…

Matlab(结构化程式和自定义函数)

目录 1.脚本编辑器 2.脚本流 2.1 控制流 2.2 关系&#xff08;逻辑&#xff09;操作符 3.脚本与函数 1.脚本编辑器 Matlab的命名规则&#xff1a; 常用功能&#xff1a; 智能缩进&#xff1a; 在写代码的时候&#xff0c;有的时候代码看起来并不是那么美观&#xff08;可读性…

栈和队列(详解)

一、栈 1.1、栈的基本概念 1.1.1、栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许…

iPhone 15 Pro与谷歌Pixel 7 Pro:哪款相机手机更好?

考虑到苹果最近将更多高级功能转移到iPhone Pro设备上的趋势,今年秋天iPhone 15 Pro与谷歌Pixel 7 Pro的对决将是一场特别有趣的对决。去年发布的iPhone 14 Pro确实发生了这种情况,有传言称iPhone 15 Pro再次受到了苹果的大部分关注。 预计iPhone 15系列会有一些变化,例如切…

企业网络安全:威胁情报解决方案

什么是威胁情报 威胁情报是网络安全的关键组成部分&#xff0c;可为潜在的恶意来源提供有价值的见解&#xff0c;这些知识可帮助组织主动识别和防止网络攻击&#xff0c;通过利用 STIX/TAXII 等威胁源&#xff0c;组织可以检测其网络中的潜在攻击&#xff0c;从而促进快速检测…

Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

使用http库进行简单的网络请求时&#xff0c;运行在Chrome浏览器上&#xff0c;网络请求一直报错 XMLHttpRequest error&#xff0c;而在iOS 模拟器上运行则正常&#xff0c;后面在postman上发送请求&#xff0c;也是正常的。这就是很尴尬了&#xff01;&#xff01;&#xff0…

公有云与私有云,IaaS、PaaS 和 SaaS云服务模型概述

云计算主要分为 4 种类型&#xff1a;私有云、公共云、混合云和多云。同时&#xff0c;云计算服务主要有 3 种&#xff1a;基础架构即服务&#xff08;IaaS&#xff09;、平台即服务&#xff08;PaaS&#xff09;和软件即服务&#xff08;SaaS&#xff09; Saas&#xff08;Sof…