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(),才能执行子类构造器的代码

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Druid介绍

Druid介绍 Druid首先是一个数据库连接池,并且是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。但它不仅仅是一个数据库连接池,它还包…

使用frp搭建内网穿透服务

使用frp搭建内网穿透服务 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 1.下载frp 下载地址 2.服务端安装 …

工作电压范围,转换速率高,相位补偿等特性的双运算放大器芯片D4510的描述

D4510是一块双运算放大器,具有较宽的工作电压范围,转换速率高,相位补偿等特性。电路能在低电源电压下:工作,电源电压范围:双电源为1V-3.5V和单电源电压为2V~7V。 主要特点: ● 低电压工作 ● 转换速率高 ● 动态输…

深度学习领域中的耦合与解耦

在阅读论文的时候应该会看到两个操作,一个是耦合,一个是解耦,经常搭配着出现的就是两个词语,耦合头(Coupled head)以及Decoupled head(解耦合头),那为什么要耦合&#xf…

冬天起不来床怎么办?羊大师给你好建议

冬天起不来床怎么办?羊大师给你好建议 冬季是让人感到懒散的季节,尤其是早上起床。寒冷的天气和温暖的被窝让人们很难离开床铺。如果你也常常遇到这个问题,不要担心,本文小编羊大师将为你分析起床困难的原因,并提供一…

“我“摸爬滚打5年,干了测试工程师,现在测试怎么样了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 小刘:…

nginx 代理接口报404 问题排查

今天遇到一个nginx代理后端接口请求报404的问题,问题是这样的,后端由于服务器没有环境,但是需要和前端联调,于是采用cpolar内网穿透的方式,穿出来了。但是前端请求跨域,于是前端用nginx代理了一下后端接口&…

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …

赠人玫瑰,手有余香,分享5款精致小巧的软件

​ 分享是一种美好的事情,它能让快乐变得更多,它能让悲伤变得更少,我会持续分享一些好用的软件给大家。 1.矢量图形设计——Affinity Designer ​ Affinity Designer是一款屡获殊荣的矢量图形设计软件,适用于 Windows、macOS 和…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦! 生活号和工作号可以分开啦~实用又简单! 详细步骤如下: ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

工业4.0时代,烤漆房控制柜如何远程监控?

烤漆房控制柜远程监控方案 一、现状 烤漆房是汽车、机械、家具等工业领域广泛应用的设备,主要用于产品的表面涂装。传统的烤漆房控制柜采用本地控制方式,操作人员在现场进行参数设置和设备控制。这种控制方式需要操作人员需要具备一定的专业知识&#x…

OpenHarmony Ohpm安装历程(个人踩坑,最后安装成功)

大家好,我是【八戒,你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享,请大家多多指教 目录 问题描述: 尝试解决 尝试一、 尝试二、 尝试三、 最终解决方案 问题描述: 当我学习到使用OpenHarmony的三方…

劲松中西医医院谭巍主任在线分析:HPV复阳的三大祸首

提到hpv,大家都不陌生,似乎对这个病毒很畏惧。即便如此,我们仍然要知道hpv病毒它与其他病毒有所不同,这是一种微小的DNA病毒,其感染性更,传播速度更快,感染途径更加广泛,可以说给人们…

Keka v1.3.5(mac压缩解压工具)

Keka是一款功能强大的文件压缩和解压缩软件,为Mac系统用户提供便捷、高效的文件管理工具。以下是Keka的主要特点和功能: 多种压缩格式支持:Keka支持多种常见的压缩格式,包括ZIP、7Z、RAR、TAR、GZIP等。它能够方便地创建和提取这些…

SAP 通过游标来分批从数据库表读取2G数据

原文链接:https://blog.csdn.net/Buffalo_soldier/article/details/109772612 我们在写程序的时候可能会遇到用内表处理超大量数据的情况,比如取MSEG、BSEG表,内表里的数据如果超过2G就会报程序dump了,所以关键是要控制内表的数据…

知云文献翻译——外语论文你get了吗?

今天博主分享一款实用的翻译软件,希望对大家日后的学习有所帮助。这个翻译网站,主要做文档翻译,可以上传PDF、Word、Excel这些格式,翻译语言也比较齐全。操作简单,功能多样的翻译软件;知云文献翻译最新版可以直接对PDF…

Jmeter —— jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具,建议按如下操作流程, 可以使整个接口测试过程更规范,更有效。 接口自动化的流程: 1、获取到接口文档:swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&…

Git 远程仓库(Github)

目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…

5.什么是Spring的依赖注入(DI)?IOC和DI的区别是什么

很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点, IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也…

走进低代码:不懂编程也能5分钟开发一个应用

目录 一、低代码开发者 1)低代码赋能IT技术人员--低代码 2)低代码赋能业务人员--零代码 二、低代码基础功能及搭建 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 三、写在最后 低代码就是将代码转变…