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

news2024/11/23 11:54:40

目录

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.coloradmin.cn/o/1230511.html

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

相关文章

Maven工程继承关系,多个模块要使用同一个框架,它们应该是同一个版本,项目中使用的框架版本需要统一管理。

1、父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…

Android studio run 手机或者模拟器安装失败,但是生成了debug.apk

错误信息如下&#xff1a;Error Installation did not succeed. The application could not be installed&#xff1a;List of apks 出现中文乱码&#xff1b; 我首先尝试了打包&#xff0c;能正常安装&#xff0c;再次尝试了debug的安装包&#xff0c;也正常安装&#xff1…

C#基础教程 多线程编程入门 Thread/Task/async/await

private void button1_Click(object sender, EventArgs e){//控制主线程(单线程操作)MessageBox.Show("开始做菜", "友情提示");Thread.Sleep(3000);//主线程休眠MessageBox.Show("素菜做好了","友情提示");Thread.Sleep(5000);Messag…

linux上安装qt creator

linux上安装Qt Creator 1 Qt Creator 的下载 下载地址为&#xff1a;http://download.qt.io/archive/qt/ 根据自己的需求选择Qt Creator版本&#xff0c;这里我下载的是5.12.9&#xff0c;如下图所示&#xff1a; 在ubuntu上可以使用wget命令下载安装包&#xff1a; wget h…

el-table实现表格内嵌套表格

文章目录 一、效果图二、使用场景三、所用组件元素&#xff08;Elementui&#xff09;四、代码部分 一、效果图 二、使用场景 &#x1f6c0;el-form 表单内嵌套el-table表格 &#x1f6c0;el-table 表格内又嵌套el-table表格 三、所用组件元素&#xff08;Elementui&#xff…

BLE协议栈入门学习

蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作&#xff0c;该频段分为40个信道&#xff0c;每个信道间隔为2MHz。 时分 蓝牙LE是半双工的&#xff0c;可以发送和接收&#xff0c;但不能同时发送和接收&#xff0c;然而&#xff0c;所有的设…

“绵柔的,好喝的”海之蓝畅销20年的经典秘诀:做大众喜爱的好酒

执笔 | 尼 奥 编辑 | 萧 萧 在中国白酒历史长河中&#xff0c;有的品牌如大浪淘沙而灰飞烟灭&#xff0c;也有的白酒品牌因为不断创新而经久不衰。我们时常在思考一个产业命题&#xff1a;白酒品牌常青的秘诀到底是什么&#xff1f; 经过20多年的产业发展&#xff0c;中国…

4-2计算小于1000的正整数的平方根

#include<stdio.h> #include<math.h> int main() {int i;int t;printf("请输入一个数:");scanf("%d",&i);if(i>1000){printf("请重新输入一个数&#xff1a;");scanf("%d",&i);}tsqrt(i);printf("%d的平方…

要事第一:如何通过6个步骤确定项目的优先级

当收到很多项目请求并且每个请求都是重中之重时&#xff0c;该怎么办&#xff1f;从最易完成的开始&#xff1f;还是先解决最大的问题&#xff1f; 实际上两种做法都不对。确定项目优先级的更好方法是评估以下内容&#xff0c;而不是关注项目规模或完成时长&#xff1a; ● 每…

论文导读 | 大语言模型与知识图谱复杂逻辑推理

前 言 大语言模型&#xff0c;尤其是基于思维链提示词&#xff08;Chain-of Thought Prompting&#xff09;[1]的方法&#xff0c;在多种自然语言推理任务上取得了出色的表现&#xff0c;但不擅长解决比示例问题更难的推理问题上。本文首先介绍复杂推理的两个分解提示词方法&a…

滚珠螺杆在航天工业领域中的重要性

滚珠螺杆是重要的航天工业配件之一&#xff0c;在航天工业领域中具有非常重要的地位和作用。 首先&#xff0c;滚珠螺杆作为一种高精度、高刚度的传动元件&#xff0c;能够提供准确的传动和定位精度&#xff0c;从而保证航天器的可靠性和性能。航天器在飞行过程中需要精确控制其…

【STM32】W25Q64 SPI(串行外设接口)

一、SPI通信 0.IIC与SPI的优缺点 https://blog.csdn.net/weixin_44575952/article/details/124182011 1.SPI介绍 同步&#xff08;有时钟线&#xff09;&#xff0c;高速&#xff0c;全双工&#xff08;数据发送和数据接收各占一条线&#xff09; 1&#xff09;SCK:时钟线--&…

软件数据采集使用代理IP的好处用哪些?

随着互联网的快速发展&#xff0c;越来越多的企业开始通过软件数据采集来获取目标客户的信息。然而&#xff0c;在进行数据采集的过程中&#xff0c;由于不同网站的访问规则和限制&#xff0c;经常会遇到一些问题。这时候&#xff0c;使用代理IP就可以很好地解决这些问题。下面…

震惊!这个网站几分钟就能制作出电子画册

一直以来&#xff0c;制作电子画册都是一项繁琐且耗时的任务&#xff0c;需要专业的设计技能和大量的时间。 但是现在&#xff0c;有了这个神奇的网站&#xff0c;FLBOOK在线制作电子杂志平台。一切都变得如此简单&#xff01;它不仅提供了丰富的模板和素材&#xff0c;还支持在…

封装实现unordered_map和set

什么是哈希思想 首先哈希是一个关联式容器&#xff0c;各个数据之间是具有关系的&#xff0c;和vector那些序列式容器不一样。 首先unordered_map中的迭代器是一个单向的迭代器。 其次在unorderede_map和set中是无序的&#xff08;因为底层不是红黑树&#xff0c;而是哈希了…

接口自动化项目落地之HTTPBin网站

原文&#xff1a;https://www.cnblogs.com/df888/p/16011061.html 接口自动化项目落地系列 找个开源网站或开源项目&#xff0c;用tep实现整套pytest接口自动化项目落地&#xff0c;归档到电子书&#xff0c;作为tep完整教程的项目篇一部分。自从tep完整教程发布以后&#…

【广州华锐互动】VR虚拟现实技术助力太空探险:穿越时空,探索宇宙奥秘

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为学生提供了更加生动、直观的学习体验。本文将以利用VR开展太空探险学习为主题&#xff0c;探讨如何将这一先进技术…

3D 纹理渲染如何帮助设计师有效、清晰地表达设计理念

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 定义 3D 渲染可视化及其用途 3D 可视化是一种艺术形式。这是一个机会。这是进步。借助 3D 纹理…

解决企业图纸管理混乱的四大方法

随着企业业务的快速发展&#xff0c;图纸作为企业生产过程中不可或缺的一部分&#xff0c;其管理也变得越来越重要。然而&#xff0c;很多企业在图纸管理方面存在很多问题&#xff0c;其中最普遍的问题就是图纸混乱。那么&#xff0c;如何解决企业图纸混乱的问题呢&#xff1f;…

我买了个AI员工,凌晨5点喊我起床,搞了篇全网40万+的爆款

大家好我是二狗&#xff0c;是夕小瑶科技说编辑部的一名作者。 前天早上凌晨5点左右的时候&#xff0c;我被尿憋醒了&#xff0c;起来上了个厕所。 就在我准备躺下接着睡的时候&#xff0c;顺手看了一眼手机。 咦?屏幕上弹出了一条邮件&#x1f4ee;推送&#xff0c;是我们编…