Java(三)(static,代码块,单例设计模式,继承)

目录

static

有无static修饰的成员变量

有无static修饰的成员方法

static的注意事项

代码块

静态代码块

实例代码块

单例设计模式

饿汉式单例写法

懒汉式单例写法

继承

基本概念

注意事项

权限修饰符

单继承

object

方法重写

子类方法中访问其他成员(成员变量,成员方法)

子类构造器


static

静态,可以修饰成员变量,成员方法

有无static修饰的成员变量

成员变量按照有无static修饰,分为两种:

(1)类变量: 有static修饰,属于类,在计算机里只有一份,会被类全部对象共享(每个对象都会有,只需要设置一次)

(2)实例变量(对象的变量):无static修饰,属于每个对象的(需要对每一个变量进行设置)

像上面这个图一样,static修饰的name变量是s1和s2共享的,age变量需要对s1和s2分别设置

推荐用类名访问类变量: 类名.类变量

下面是我们访问到类中的变量的流程图: 我们的类创建到方法区中,我们的类变量会被存放到堆内存中,我们new出来的对象也会放到堆内存中,我们栈内存会存放一些指令,当我们要访问age时直接到堆内存中访问修改,想访问name时会跳到方法区找到类,然后通过类访问到类变量

访问自己的类变量是可以省略不写类名的

有无static修饰的成员方法

类方法:静态方法,属于类,可以直接用类名访问,也可以用对对象访问

实例方法: 对象的方法

啥叫工具类: 工具类中的方法都是类方法, 每一个类方法都是用来完成一个功能,不需要创建对象

static修饰的成员方法一般应用在工具类中,而不是实例方法中

当我们想要调用一个类的方法的时候,仅仅只是调用方法,我们直接将这个方法指定成类方法,到时候我们想要调用这个方法的时候直接,用  类名.成员方法  就行了,就不用创建对象,在调用对象的实例的方法,如果再创建一个对象,对象会占内存,这样会浪费内存

工具类定义的时候有什么要求? 工具类不需要创建对象,建议将工具类的构造器私有化

static的注意事项

1.类方法中可以直接访问类的成员,不可以直接访问实例成员

2.实例方法既可以直接访问类成员,也可以直接访问实例成员

3.实例方法中可以出现this关键字,类方法不可以出现this关键字的

因为我们调用实例方法的时候,是用对象名.实例方法的,其实是有一个对象,this就是我们这个对象

而我们一般调用类方法的时候,一般是用类名.类方法.没有对象,那我这个this就没有指向的对象了

代码块

静态代码块

格式: static { }

特点: 类加载的时候自动执行,由于类只会加载一次,所以静态代码块也只会执行一次

作用:完成类的初始化,一般可以对类变量进行初始化赋值

但是代码块只会执行一次,只是在一开始的时候加载类的时候去执行,我们在下面进行验证

实例代码块

格式 : { }

特点: 每次创建对象时,执行实例代码块,并在执行构造器前执行

单例设计模式

饿汉式单例写法

调用类方法的时候,对象已经创建了的

public class Student {// 1.必须私有类的构造器private Student(){}// 2.定义一个类变量记住类的一个对象private static Student a = new Student();//3.定义一个类方法返回类的对象public static Student getObject(){return a;}

创建唯一的一个对象

懒汉式单例写法

第一次调用方法就创建这个对象,以后调用的时候都返回这个对象

import org.w3c.dom.ls.LSOutput;public class Student {// 1.把类的构造器私有private Student(){}// 2. 定义一个类变量,用于储存这个类的一个对象private static Student s1;// 3. 定义一个类方法,这个方法要保证第一个调用时// 才创建一个对象,后面调用的时候都会返回一个对象public  static Student getObject(){if(s1 == null){s1 = new Student();}return s1;}}
public class test {public static void main(String[] args) {Student stu1 = Student.getObject();Student stu2 = Student.getObject();System.out.println(stu1 == stu2);}
}

我们发现打印出来的结果是true,说明这个设计模式仅仅创建了一个对象

继承

基本概念

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

继承的特点: 子类能继承父类的非私有成员(成员变量,成员方法)

继承后对象的创建: 子类的对象是由子类,父类共同完成的

我们可以用继承来简化代码,不让代码那么繁琐

假若说我要写两个对象,第一个是老师,老师的数据有名字,具有的技能

第二个是快递员,快递员的数据有名字,送快递的单数

我们要创建两个对象的话一般会按照下面这样来创建

// 快递员对象
public class Courier {private String name;private int number;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}
}
// 老师对象
public class Teacher {private String name;private String skill;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}

我们会发现:老师和快递员都会有一个相同的成员属性:名字

我们可以整一个父类,父类People对象中有neme方法,让老师对象和快递员对象都继承得到父类的公共属性和方法

// 快递员的对象
public class Courier extends People {private int number;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}
}
// 老师对象
public class Teacher extends People{private String skill;public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}

当我们创建老师对象的时候也会访问到父类中的共有方法,通过共有方法,我们就可以设置老师的姓名

public class test {public static void main(String[] args) {Teacher t1 = new Teacher();t1.setName("李小谦");System.out.println(t1.getName());t1.setSkill("爱讲物理课");System.out.println(t1.getSkill());}
}

注意事项

权限修饰符

public private protected 缺省

权限的大小关系: public  > protected > 省略 > private 

下面是他们的访问范围

单继承

Java是单继承的,一个类只能继承一个直接父类,Java中的类不支持多继承,但是支持多层继承的

但是支持多继承

class A{}
class B extends A{}
class C extends B {}

object

object类是Java中所有的类的祖宗

我们在设计类的时候,会默认指定object类的子类

方法重写

啥是方法重写?

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

注意:重写后,方法的访问Java会遵循就近原则

我们先来展示一下什么是方法重写

当我们创建一个C对象的时候,调用print1和print2实例方法的时候,会打印重写方法里面的内容

尽量在上面标注一个@Override,表示我们在改写父类中的方法

子类方法中访问其他成员(成员变量,成员方法)

按照就近原则

子类构造器

特点: 子类的全部构造器,都会先调用父类的构造器,再执行自己

子类构造器是如何实现调用父类构造器的?

默认情况下,子类全部构造器的第一行代码都是super()(写不写默认都是有的),他会调用父类的无参数构造器,如果父类没有无参数构造器,则我们必须在子类构造器中的第一行手写super(里面带有参数,和父类中有参数构造器中的参数一一对应)

我们来看看执行结果

假如说我将父类构造器改为有参数构造器,变成下面这样

那我们也必须在子类中手写一个带参数super(),才能执行子类构造器的代码

我们看看问什么这么做呢?

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

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

相关文章

Flume学习笔记(3)—— Flume 自定义组件

前置知识: Flume学习笔记(1)—— Flume入门-CSDN博客 Flume学习笔记(2)—— Flume进阶-CSDN博客 Flume 自定义组件 自定义 Interceptor 需求分析:使用 Flume 采集服务器本地日志,需要按照日志…

交易机器人-微信群通知

微信公众号:大数据高性能计算 1 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行量化交易的时候,就需要自己去做一些量化…

Linux 环境搭建

✨个人主页: Anmia.🎉所属专栏: C Language 🎃操作环境: Visual Studio 2019 版本 本章概要 1. 认识 Linux, 了解 Linux 的相关背景 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. Li…

语义检索系统【全】:基于milvus语义检索系统指令全流程-快速部署版

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 博主首页,更多redis、java等优质好文以及各种保姆级教程等您挖掘! 目录 前言 JetBrains全家桶介绍 申请过程: 获取学…

C++类与对象(2)—构造函数析构函数

目录 一、类的6个默认成员函数 二、构造函数 1、定义 2、特征 三、析构函数 1、定义 2、特征 四、默认生成构造&析构 1、定义 2、内置类型 3、自定义类型 4、声明处给默认值 5、总结 下一篇 一、类的6个默认成员函数 如果一个类中没有定义任何成员&#xff0…

Idea2023 Springboot web项目正常启动,页面展示404解决办法

Idea2023 Springboot web项目正常启动,页面展示404解决办法 问题: 项目启动成功,但是访问网页,提示一直提示重定向次数过多,404 解决方法 在IDEA的Run/Debug Configurations窗口下当前的Application模块的Working directory中添…

python 对图像进行聚类分析

import cv2 import numpy as np from sklearn.cluster import KMeans import time# 中文路径读取 def cv_imread(filePath, cv2_falgcv2.COLOR_BGR2RGB): cv_img cv2.imdecode(np.fromfile(filePath, dtypenp.uint8), cv2_falg) return cv_img# 自定义装饰器计算时间 def…

vue中使用echarts渐变柱状图 Cannot read properties of undefined (reading ‘graphic‘)解决方法

在使用渐变颜色时报错,Cannot read properties of undefined (reading ‘graphic’) echarts也下载了,引入了,就是报错,用不了new charts, 结果换了一个版本号就可以了,本来用的"echarts": "…

7.docker运行redis容器

1.准备redis的配置文件 从上一篇运行MySQL容器我们知道,需要给容器挂载数据卷,来持久化数据和配置,相应的redis也不例外。这里我们以redis6.0.8为例来实际说明下。 1.1 查找redis的配置文件redis.conf 下面这个网址有各种版本的配置文件供…

02-1解析xpath

我是在edge浏览器中安装的xpath,需要安装的朋友可以参考下面这篇博客最新版edge浏览器中安装xpath插件 一、xpathd的使用 安装lxml pip install lxml ‐i https://pypi.douban.com/simple导入lxml.etree from lxml import etreeetree.parse() 解析本地文件 htm…

linux镜像的下载,系统下载(个人使用)

文章目录 一、系统之家二、国内镜像源三、Centos官网四、安装成功截图五、镜像类型的区别参考文档 一、系统之家 系统之家官网 二、国内镜像源 下载镜像地址: 1、官网地址:https://www.centos.org/ 2、阿里镜像站:https://mirrors.aliyu…

java基础练习缺少项目?看这篇文章就够了(上)!

公众号:全干开发 。 专注分享简洁但高质量的动图技术文章! 项目概述 本教程适合刚学习完java基础语法的同学,涉及if语句、循环语句、类的封装、集合等基础概念,使用大量gif图帮助读者演示代码操作、效果等,是一个非常…

基于单片机16路抢答器仿真系统

**单片机设计介绍, 基于单片机16路抢答器仿真系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的16路抢答器仿真系统是一种用于模拟和实现抢答竞赛的系统。该系统由硬件和软件两部分组成。 硬件方面&am…

CICD 持续集成与持续交付——gitlab

部署 虚拟机最小需求:4G内存 4核cpu 下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装依赖性 [rootcicd1 ~]# yum install -y curl policycoreutils-python openssh-server perl[rootcicd1 ~]# yum install -y gitlab-ce-15.9.3-ce.0…

Idea 2023.2.5配置(插件、Maven等)

IDEA2023.2.5配置 一. 插件Alibaba Java Coding Guidelines plugin supportMaven HelperMyBatisXSonarLintTranslationVuesion Theme 二. 自定义创建live template,快速写代码三. 修改全局配置3.1 Maven配置3.1.1 安装MavenStep1. 下载Step2. 安装Step3. 创建系统环…

Linux常见命令手册

目录 文件命令 文件和目录命令 文件的权限命令 文件搜索命令 进程命令 查看进程命令 关闭进程命令 用户和群组命令 网络命令 firewall-cmd 网络应用命令 高级网络命令 网络测试命令 网络安全命令 网络配置命令 软件管理命令 系统信息命令 vi编辑器 关机命令…

【uniapp/uview1.x】u-upload 在 v-for 中的使用时, before-upload 如何传参

引入: 是这样一种情况,在接口获取数据之后,是一个数组列表,循环展示后,需要在每条数据中都要有图片上传,互不干扰。 分析: uview 官网中有说明,before-upload 是不加括号的&#xff…

.Net6 部署到IIS示例

基于FastEndpoints.Net6 框架部署到IIS 环境下载与安装IIS启用与配置访问网站 环境下载与安装 首先下载环境安装程序,如下图所示,根据系统位数选择x86或者x64进行下载安装,网址:Download .NET 6.0。 IIS启用与配置 启用IIS服务 打开控制面板&#xff…

FPC焊点剥离失效分析

一、案例背景 FPC在后续组装过程中,连接器发生脱落。在对同批次的样品进行推力测试后,发现连接器推力有偏小的现象。据此进行失效分析,明确FPC连接器脱落原因。 #1、#2样品连接器脱落连接器脱落;#3样品连接器未脱落;…