面向对象(三)

一、Static关键字:

1.概述:Static是一个静态关键字;

2.使用:

a.修饰一个成员变量:

static 数据类型 变量名

b.修饰一个方法:

修饰符 static 返回值类型 方法名(形参){

方法体

return 结果

}

3.调用静态成员:

类名直接调用(不用new对象)

4.静态成员特点:

a.静态成员属于类成员,不属于对象成员(非静态的成员属于对象成员)

b.静态成员会随着类的加载而加载

c.静态成员优先于非静态成员存在在内存中

d.凡是根据静态成员所在类创建出来的对象,都可以共享这个静态成员

5.static关键字在程序运行中的内存占用情况:

jdk8及以后,静态区从方法区移动到堆内存中存放,原因是堆内存对于清理无效数据更高效,对内存的管理更合理。

6.静态成员访问特点

(1)在静态方法中能直接访问非静态成员嘛?------不能

想要调用的话:new对象调用

(2)在非静态方法中能直接访问静态成员嘛?------能

a.同类:

直接调用/类名调用

b.不同类:

类名调用

(3)静态方法中能直接访问静态成员嘛?------能

a.同类:

直接调用/类名调用

b.不同类:

类名调用

(4)非静态方法中能直接访问非静态成员嘛?------能

a.同类

直接调用/new对象调用

b.不同类:

new对象调用

总结:

(1)不管在不在同一个类中,非静态成员都可以new对象调用;

(2)不管在不在同一个类中,静态成员都可以类名调用。

7.静态成员在开发中的使用场景:

(1)既然static成员好用(类名直接调用,不用new对象调用),那么实际开发中,为什么不把所有成员都定义成静态的呢?

原因:因为静态成员会随着类的加载而加载,如果所有成员都是静态的,那么当类一加载,所有的成员都会进入内存,占用大量内存空间。

(2)那么静态成员什么时候定义呢?

一般情况下,我们在抽取工具类的时候可以将工具类中的所有成员都定义成静态的

(3)那么什么时候定义工具类呢?

如果有些功能在整个代码中重复实现,代码一样,实现功能一样,那就可以将这部分代码抽取出来,形成工具类。

8.可变参数:

(1)需求:定义一个方法,实现n个整数相加

(2)分析:方法参数位置,只明确了参数的类型,但是不明确参数个数,此时就可以定义成可变参数

(3)定义格式

数据类型...变量名

(4)注意:

a.可变参数的本质是一个数组;

b.参数位置不能连续写多个可变参数,而且当可变参数和其他普通参数一起使用时,可变参数需要放到数据列表的最后。

(5)可变参数的练习:

a.返回n个字符串拼接结果,如果没有传入字符串,那么返回空字符串""

java 复制代码
public class ArrChanged {

    public static void main(String[] args) {

        String result = getString("野夫怒见不平事",",","磨损胸中万古刀");
        System.out.println(result);
    }


    public static String getString(String...s){

        String c = "";

        for (int i = 0; i < s.length; i++) {

            c += s[i];
        }
        return c;

    }
}

b.n个字符串进行拼接,每个字符串之间使用某字符进行分隔,如果没有字符串,那么返回空字符串""

java 复制代码
public class ArrChanged {

    public static void main(String[] args) {

        String result = getString("-","love","life","sky","robot");
        System.out.println(result);
    }


    public static String getString(String regex,String...s){
        String c = "";
        for (int i = 0; i < s.length; i++) {
            if ( i == s.length-1){
                c += s[i];
            }else {
            c += s[i] + regex;
            }
        }
        return c;

    }
}
相关推荐
FQNmxDG4S5 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人6 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang6 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje6 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab7 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang