首页 > 其他分享 >面向对象高级-static

面向对象高级-static

时间:2024-10-27 10:21:01浏览次数:3  
标签:代码 高级 面向对象 实例 static Student 方法 public

文章目录

在这里插入图片描述


static 读作静态,可以用来修饰 成员变量,也能修饰成员方法。

1.1 static修饰成员变量

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

在这里插入图片描述
在这里插入图片描述

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

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

  • 下面是代码演示(注意静态变量,和实例变量是如何调用的)

在这里插入图片描述

看一下上面代码的 内存原理

在这里插入图片描述

| 在这里插入图片描述


1.2 static 修饰成员变量的应用场景

在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成 类变量 。

我们看一个案例

需求:系统启动后,要求用于类可以记住自己创建了多少个用户对象。

  • 第一步:先定义一个User类,在用户类中定义一个 static 修饰的变量,用来表示在线人数;
public class User{
    public static int number;
    //每次创建对象时,number自增一下
    public User(){
        User.number++;
    }
}
  • 第二步:再写一个测试类,再测试类中创建4个User对象,再打印 number 的值,观察 number 的值是否再自增。
public class Test{
    public static void main(String[] args){
        //创建4个对象
        new User();
        new User();
        new User();
        new User(); 
        
        //查看系统创建了多少个User对象
        System.out.println("系统创建的User对象个数:"+User.number);
    }
}

运行上面的代码,查看执行结果是:系统创建的User对象个数:4

1.3 static 修饰成员方法

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

在这里插入图片描述

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

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

我们看一个案例,演示类方法、实例方法的基本使用

  • 先定义一个 Student 类,在类中定义一个类方法、定义一个实例方法
public class Student{
    double score;
    
    //类方法:
    public static void printHelloWorld(){
        System.out.println("Hello World!");
        System.out.println("Hello World!");
    }
    
    //实例方法(对象的方法)
    public void printPass(){
        //打印成绩是否合格
        System.out.println(score>=60?"成绩合格":"成绩不合格");
    }
}
  • 在定义一个测试类,注意类方法、对象方法调用的区别
public class Test2{
    public static void main(String[] args){
        //1.调用Student类中的类方法
        Student.printHelloWorld();
        
        //2.调用Student类中的实例方法
        Student s = new Student();        
        s.printPass();
        
        //使用对象也能调用类方法【不推荐,IDEA连提示都不给你,你就别这么用了】
        s.printHelloWorld();
        //Student.printHelloWorld(); 报错,实例方法只能使用对象调用
    }
}

搞清楚 类方法 和 实例方法 如何调用之后,接下来再聊一聊 static 修饰成员方法的内存原理。

1.类方法:static修饰的方法,可以被类名调用,是因为它是随着类的加载而加载的;所以类名直接就可以找到static修饰的方法
		 
2.实例方法:非static修饰的方法,需要创建对象后才能调用,是因为实例方法中可能会访问实例变量,而实例变量需要创建对象后才存在。所以实例方法,必须创建对象后才能调用。

在这里插入图片描述

| 在这里插入图片描述


1.4 工具类来看 static 的应用

需求: 生成验证码

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

  • 我们写一个生成验证码的工具类
public class MyUtils{
    public static String createCode(int n){
        //1.定义一个字符串,用来记录产生的验证码
        String code = "";
        
        //2.验证码是由所有的大写字母、小写字母或者数字字符组成
        //这里先把所有的字符写成一个字符串,一会从字符串中随机找字符
        String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ";
        
        //3.循环n次,产生n个索引,再通过索引获取字符
        Random r = new Random();
        for(int i=0; i<n; i++){
            int index = r.nextInt(data.length());
            char ch = data.charAt(index);
            //4.把获取到的字符,拼接到code验证码字符串上。
            code+=ch;
        }
        
        //最后返回code,code的值就是验证码
        return code;
    }
}

工具类的使用就是这样子的

在补充一点,工具类里的方法全都是静态的,推荐用类名调用为了防止使用者用对象调用。我们可以把工具类的构造方法私有化。

public class MyUtils{
    //私有化构造方法:这样别人就不能使用构造方法new对象了
    private MyUtils(){
        
    }
    
    //类方法
    public static String createCode(int n){
       ...
    }
}

1.5 static 的注意事项

静态方法可以直接方法静态成员, 不可以直接访问非静态成员.

非静态方法既可以访问静态成员 也可以访问非静态成员.


1.6 static 应用(代码块)

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

静态代码块:

在这里插入图片描述

public class Student {
    static int number = 80;
    static String schoolName = "清华大学";
    // 静态代码块
    static {
        System.out.println("静态代码块执行了~~");
        schoolName = "清华大学";
    }
}

静态代码块不需要创建对象就能够执行

public class Test {
    public static void main(String[] args) {
        // 目标:认识两种代码块,了解他们的特点和基本作用。
        System.out.println(Student.number);
        System.out.println(Student.number);
        System.out.println(Student.number);

        System.out.println(Student.schoolName); // 清华大学
    }
}

执行上面代码时,发现没有创建对象,静态代码块就已经执行了。

在这里插入图片描述

关于静态代码块重点注意:静态代码块,随着类的加载而执行,而且只执行一次。

再来了解一下实例代码块

在这里插入图片描述

实例代码块的作用和构造器的作用是一样的,用来给对象初始化值;而且每次创建对象之前都会先执行实例代码块。

public class Student{
    //实例变量
	int age;
    //实例代码块:实例代码块会执行在每一个构造方法之前
    {
        System.out.println("实例代码块执行了~~");
        age = 18;
        System.out.println("有人创建了对象:" + this);
    }

    public Student(){
        System.out.println("无参数构造器执行了~~");
    }

    public Student(String name){
        System.out.println("有参数构造器执行了~~");
    }
}

接下来在测试类中进行测试,观察创建对象时,实例代码块是否先执行了。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student("张三");
        System.out.println(s1.age);
        System.out.println(s2.age);
    }
}

对于实例代码块重点注意:实例代码块每次创建对象之前都会执行一次


1.7 static应用(单例设计模式)

关于 static 的应用我们再补充一个使用的技巧,叫做单例设计模式。

单例设计模式

1. 单例设计模式能够解决什么问题?
答: 使一个类只能有一个对象

2.单例设计模式开发步骤?
①私有化构造方法
②提供一个私有类变量,这个类变量的数据类型是该类本身,并赋值
③提供一个公共的类方法,返回本类对象

执行原理

在这里插入图片描述


标签:代码,高级,面向对象,实例,static,Student,方法,public
From: https://blog.csdn.net/Snowyyds/article/details/143264905

相关文章

  • 简答剖析 UDP:从基础代码到高级封装与应用
    C++学习之路一、C++中构造函数与析构函数简单解析二、Makefile编写简单教程三、UDP协议学习四、简答剖析UDP:从基础代码到高级封装与应用简答剖析UDP:从基础代码到高级封装与应用C++学习之路前言一、UDP基础:涉及的API和结构体(一)`sockaddr_in`结构体(二)`sock......
  • 掌握高级 SQL 技巧:高效处理复杂数据查询和优化(附原始代码)
    引言在数据驱动的时代,SQL(结构化查询语言)是数据库管理和数据分析中不可或缺的工具。随着数据复杂度和数据量的增加,掌握SQL的高级技巧不仅能帮助我们高效处理复杂的数据查询,还能极大地提高数据库的性能和数据处理效率。本文将从窗口函数、递归查询、子查询优化、索引管理、数......
  • redis高级篇之IO多路复用select方法简介 第174节答疑
    1、bitmap最大1024位,一个进程最多只能处理1024个客户端2、&rset不可重用,每次socket有数据就相应的位会被置位3、文件描述符数组拷贝到了内核态(只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)),仍然有开销。select调用需要传入fd数组,需要拷贝一份到内核,高......
  • redis高级篇之IO多路复用IOMultiplexing从学术到人话版 172节答疑
    ref:selectRecieve.png这图什么意思,select是阻塞的,然后呢?这张图展示了I/O复用模式下的工作流程,特别是使用`select`系统调用进行I/O复用的情况。在这种模式下,`select`用于监听多个文件描述符(如套接字),等待其中任何一个变为可读、可写或有异常发生。以下是图中各部分的详......
  • redis高级篇之skiplist跳表 第164节答疑
    跳表查询的空间复杂度分析比起单纯的单链表,跳表需要存储多级索引,肯定要消耗更多的存储空间。那到底需要消耗多少额外的存储空间呢?我们来分析一下跳表的空间复杂度。第一步:首先原始链表长度为n,第二步:两两取首,每层索引的结点数:n/2,n/4,n/8..,8,4,2每上升一级就减少一半,......
  • Java面向对象
    **Java面向对象学习心得**在学习Java的过程中,面向对象编程(OOP)无疑是最重要的概念之一。Java是一门纯面向对象的编程语言,它通过类和对象的概念使得程序设计更为清晰、模块化,并且便于维护和扩展。以下是我在学习Java面向对象编程过程中的一些心得体会。一、理解面向对象的......
  • 高级RAG技术:提升生成式AI系统输出质量与性能鲁棒性【预检索、检索、检索后、生成优化
    高级RAG技术:提升生成式AI系统输出质量与性能鲁棒性【预检索、检索、检索后、生成优化等】检索增强生成(RAG)是一种强大的技术,它将信息检索与生成式AI相结合,以产生更准确、上下文更丰富的响应。本文将探讨15种高级RAG技术,以提高生成式AI系统的输出质量和整体性能的......
  • 高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收器?我回答:1.Serial收集器特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即StopTheWorld(STW)。单线程工作,适合单核CPU。在年......
  • 高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收算法?我回答:在Java虚拟机(JVM)中,垃圾回收(GarbageCollection,GC)是一项非常重要的功能,用于自动管理应用程序的内存。JVM采用多种垃圾回收算法来决定何时以及如何回收不再使用的对象所占用的内......
  • AGV电子地图之使用贝塞尔曲线画高级地图
    AGV电子地图之使用贝塞尔曲线画高级地图_哔哩哔哩_bilibili点击关注不迷路,你的关注是我们最大的动力。一个AGV地图的示例二、怎么用贝塞尔曲线画不规则形状三、示例代码 <PathStroke="Black"StrokeThickness="2"Fill="Transparent">   <Path.Data>   ......