Java学习Day16:基础篇6

news2024/9/17 8:19:07

1.静态和非静态

2.调用静态和非静态的过程

注:在Java中,同类中,确实可以使用类的对象来调用静态方法,尽管这不是推荐的做法。静态方法属于类本身,而不是类的任何特定实例。因此,理论上讲,你应该通过类名来调用静态方法,而不是通过类的实例。

1.加载

开始调用之前需要将Tset类加载;

这一句的作用顺序也是先加载Static_ B类然后再在堆中创建对象static B,都需要先加载!

2.非静态掉用过程

非静态方法:需要通过类的实例(对象)来调用,也就是需要先创建类的对象,因为非静态方法属于类的实例,所以每个实例都可以有自己的非静态方法副本(尽管在大多数情况下,由于方法区共享,这只是一个概念上的说法)。非静态随着实例(对象)加载而加载

3.静态调用过程(蓝色)

静态方法:可以直接通过类名来调用,而无需创建类的实例。这是因为静态方法属于类本身,而不是类的某个特定对象。所以使用Static_ B.mi直接调用,跳过堆区;静态成员随着类的加载而加载。

3.调用权限

  • 静态方法只能直接访问类的静态变量静态方法,不能直接访问类的非静态变量和非静态方法。如果需要访问非静态成员,必须通过  类  对象 = new 类 来访问。

  • 非静态方法:可以访问类的静态变量、静态方法以及非静态变量和非静态方法,全都可以直接访问

4.内存占用

  • 静态方法属于类级别,理论上不占用对象的堆内存。但是,静态方法中的局部变量仍然会被存储在栈内存中。

  • 非静态方法作为对象的一部分,虽然其方法体本身不直接占用对象的堆内存,但方法的调用(包括方法中的局部变量)会占用栈内存。

5.功能分类

1.静态方法

通常用于工具类中的方法,这些方法不依赖于对象的状态,而是执行一些通用的操作(查询之类的)。

2.非静态方法

通常用于表示对象的行为,这些行为可能会修改对象的状态或基于对象的状态来执行操作,特殊性使用非静态。

6.生命周期

  • 静态方法:在类加载到JVM时就被加载到方法区,因此它的生命周期和类相同。当类被卸载时,静态方法也随之卸载。

  • 非静态方法:不直接关联于类的加载过程。非静态方法通常在创建类的实例时,随实例一起被初始化(虽然方法的实际代码仍然存储在方法区)。当实例被销毁时,非静态方法本身并不直接销毁,但其对应的实例方法调用上下文会消失

7.成员变量

分为:

8.private

实例:

public class Teacher {
    private int  id;
    private String name;
    private int age;
    public void changeid(int a ){
         if (a<0||a>100){
             System.out.println("Nope!");
         }else {
             id=a;
             System.out.println(age);
         }
     }
    public void changename(String name1){
        if (name1.length()>3||name1.length()==0){
            System.out.println("Nope!");
        }else {
            name=name1;
            System.out.println(name);
        }
    }
    public void changeage(int age1){
        if (age1<0||age1>130){
            System.out.println("Nope!");
        }else {
            age=age1;
            System.out.println(age);
        }
    }
}
import java.util.Scanner;

public class text {
    static Scanner sc =new Scanner(System.in);
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        System.out.println("ID");
        int a=sc.nextInt();
        teacher.changeid(a);
        System.out.println("NAME");
        String name1= sc.next();
        teacher.changename(name1);
        System.out.println("AGE");
        int age1 = sc.nextInt();
        teacher.changeage(age1);
    }
}

9.this

在Java中,this关键字是一个非常重要的概念,它主要用于指代当前对象。this关键字在Java中有多种用途,但主要可以归结为以下几个方面:

  1. 引用当前对象的属性和方法
    当你需要在类的方法内部引用当前对象的成员(字段或方法)时,可以使用this关键字。这在方法中的局部变量与类的成员变量同名时特别有用,因为this可以明确指明你是在引用类的成员变量。

  2. 在构造器中调用另一个构造器
    在Java中,你可以在一个构造器中使用this()语法来调用同一个类的另一个构造器。注意,这种调用必须是构造器中的第一条语句。

  3. 返回当前对象的引用
    在某些情况下,this可以用于返回当前对象的引用。这在实现链式调用(如StringBuilder类中的方法)时非常有用。

  4. 区分隐藏的成员
    当子类从父类继承了一个成员(字段或方法),并且子类定义了同名的成员时,子类成员会隐藏父类的成员。此时,在子类中可以通过this关键字引用子类成员,通过super关键字引用父类成员。

public class Teacher {
    private int  id;
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public void setIid(int id ){
         if (id<0||id>100){
             System.out.println("Nope!");
         }else {
             this.id=id;
         }
     }
    public void setName(String name){
        if (name.length()>3||name.length()==0){
            System.out.println("Nope!");
        }else {
            this.name=name;
        }
    }
    public void setAge(int age){
        if (age<0||age>130){
            System.out.println("Nope!");
        }else {
             this.age=age;
        }
    }

    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String toString() {
        return "Teacher{id = " + id + ", name = " + name + ", age = " + age + "}";
    }
}
import java.util.Scanner;

public class text {
    static Scanner sc =new Scanner(System.in);
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        System.out.println("ID");
        int id=sc.nextInt();
        teacher.setIid(id);
        System.out.println(teacher.getId());
        System.out.println("NAME");
        String name= sc.next();
        teacher.setName(name);
        System.out.println(teacher.getName());
        System.out.println("AGE");
        int age = sc.nextInt();
        teacher.setAge(age);
        System.out.println(teacher.getAge());
    }
}

10.构造方法

在Java中,构造方法(Constructor)是一种特殊类型的方法,用于在创建对象时初始化对象。它不具有返回类型void都不写。构造方法的名称必须与类名完全相同,并且可以通过不同的参数列表来重载构造方法,就像重载普通方法一样。

以下是构造方法的一些关键特点:

  1. 名称与类名相同:构造方法的名称必须与类名完全匹配。
  2. 没有返回类型:连void都不写。
  3. 主要作用是初始化:在创建对象时自动调用,用于初始化对象的成员变量。
  4. 可以被重载:一个类可以有多个构造方法,只要它们的参数列表不同即可。
  5. 默认构造方法:如果类中没有显式定义任何构造方法,则编译器会自动提供一个无参的默认构造方法。但是,一旦定义了至少一个构造方法,编译器就不会再提供默认构造方法了。

11.标准类

12.无参数构造方法应用场景

小练习:

package NumberSystem;
import java.util.Scanner;
public class NMM {
    String name;
    int count;
    double price;
    public NMM() {
    }
    NMM [] shopList =new NMM[100];
    Scanner sc = new Scanner(System.in);
    public void Caidan (){
        for (;;) {
            System.out.println("------欢迎使用数据库管理系统------");
            System.out.println("1:Check Data");
            System.out.println("2:Change Date");
            System.out.println("3:Add Date");
            System.out.println("4:Del Date");
            System.out.println("5:Display All");
            System.out.println("6:Quit");
            System.out.println("输入编号:");
            int num = sc.nextInt();
            int temp = 0;
            if (num==1){
                System.out.println("正在使用数据查询功能,请输入name:");
                String name =sc.next();
                getMessage(name);
            }//1.查询功能
            if (num==2){
                System.out.println("正在使用数据修改功能,请输入name:");
                String name =sc.next();
                update(name);
            }//修改数据功能
            if (num==3){
                System.out.println("正在使用数据录入功能,请输入name:");
                String name =sc.next();
                System.out.println("正在使用数据录入功能,请输入count:");
                int count =sc.nextInt();
                System.out.println("正在使用数据录入功能,请输入price:");
                double price = sc.nextDouble();
                add(name,count,price);
            }//添加数据功能
            if (num == 4) {
                System.out.println("正在使用数据删除功能,请输入name:");
                String name =sc.next();
                del(name);
            } //删除数据功能
            if (num==5){
                for (int i = 0; i < shopList.length; i++) {
                    if (shopList[i] != null) { // 首先检查 shopList[i] 是否为 null
                        if (shopList[i].getName() != null) {
                            String na = shopList[i].getName();
                            int con = shopList[i].getCount();
                            double pri = shopList[i].getPrice();
                            String str = toString(na, con, pri); // 假设 toString 是一个有效的方法
                            System.out.println(str);
                        } else {
                            // 这里处理 getName() 返回 null 的情况
                            System.out.println("位置 " + i + " 的商品名称为 null");
                            break;
                        }
                    } else {
                        // 这里处理 shopList[i] 为 null 的情况
                        System.out.println("位置 " + i + " 的整个商品对象为 null");
                        break;
                    }
                }
            }
            if (num==6){
                break;
            }//跳出循环
        }
    }

    private void del(String name) {
        for (int i = 0; i< shopList.length; i++) {
            if(shopList[i].getName().equals(name)){
                shopList[i].setName(null);
                shopList[i].setCount(0);
                shopList[i].setPrice(0.0);
                System.out.println("删除成功!");
                break;
            }
        }
    }//删除数据

    private void update(String name) {
        for (int i = 0; i< shopList.length; i++) {
            if(shopList[i].getName().equals(name)){
                System.out.println("正在使用数据修改功能,请输入修改后的name:");
                String na =sc.next();
                System.out.println("正在使用数据修改功能,请输入修改后的count:");
                int con =sc.nextInt();
                System.out.println("正在使用数据修改功能,请输入修改后的price:");
                double pri = sc.nextDouble();
                shopList[i].setName(na);
                shopList[i].setCount(con);
                shopList[i].setPrice(pri);
                String str= toString(na,con,pri);
                System.out.println(str);
                break;
            }
        }
    }//更新数据模块

    private void getMessage(String name) {
        for (int i = 0; i< shopList.length; i++) {
            if(shopList[i].getName().equals(name)){
                String na= shopList[i].getName();
                int con =shopList[i].getCount();
                double pri= shopList[i].getPrice();
                String str= toString(na,con,pri);
                System.out.println(str);
                break;
            }
    }
}//查询模块

    private void add(String name,int count,double price) {
        for (int i = 0; i< shopList.length; i++) {
            if(shopList[i]==null){
                shopList[i]=new NMM();//初始化!!!!!!!!!!!
                shopList[i].setName(name);
                shopList[i].setCount(count);
                shopList[i].setPrice(price);
                String str= toString(shopList[i].getName(),shopList[i].getCount(),shopList[i].getPrice());
                System.out.println(str);
                break;
            }
            System.out.println(shopList[i]);
        }
    }//添加模块





    public String toString(String name,int count ,double price) {
        return "添加后数据:{name = " + name + ", count = " + count + ", price = " + price + "}";
    }
    public NMM(String name, int count, double price) {
        this.name = name;
        this.count = count;
        this.price = price;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

}

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

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

相关文章

分隔链表(LeetCode)

题目 给你一个链表的头节点 和一个特定值 &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 的节点都出现在 大于或等于 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例1&#xff1a; 输入&#xff1a;&#xff0c; 输出&#xff1a; 示例2&a…

七言-绝美崇州

题记 今天&#xff0c;2024年07月30日&#xff0c;在看到《今日崇州》 发布的航拍风光照片之后&#xff0c;这才方知笔者虽已寄居崇州“西川第一天”街子古镇养老逾五年&#xff0c;竟然不知崇州拥有如此之多的青山绿水&#xff0c;集生态、宜居、智慧、文化、旅游丰富资源于一…

python if语句如何结束

python if语句如何结束&#xff1f;下面给大家介绍两种终止方法&#xff1a; break 用于提前终止循环&#xff1b; num 1 while num < 100:if num > 10:breakprint(num)num 2 print("结束") 结果如下&#xff1a; 1 3 5 7 9 结束 continue 用于跳出当前循…

为 Oh My Zsh 安装 Powerlevel10k 主题

继上一章 安装Zsh 与 oh my zsh 打开终端&#xff0c;运行以下命令&#xff0c;从 GitHub 上克隆 Powerlevel10k 代码库&#xff0c;并将文件放到 Oh My Zsh 的配置文件夹中 git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k 用文本…

海外短剧平台部署与快速搭建实战指南

目录 一、海外短剧系统是什么 二、搭教程 技术选型 开发前端和后端 三、部分代码展示 随着网络覆盖的广泛扩展与全球化趋势的日益加深&#xff0c;构建面向海外的短视频剧集平台已演变为企业进军国际舞台、拓宽市场边界的关键策略。海外短剧系统不仅承载着将精心制作的短剧…

moment.js时间格式化插件使用

moment.js插件常用api备忘 moment.js插件功能远不不仅仅是在格式化日期上&#xff0c;还是有很多很好用奇淫技巧&#xff0c;使用起来也是更加方便&#xff0c;主要在vue项目中使用偏多&#xff0c;&#xff0c;但是有时候也不是总使用&#xff0c;将一些项目中可能会用&#x…

国内民营企业「数字化转型」典型案例

一、企业简介 三一集团成立于1989年&#xff0c;现有3家上市公司&#xff08;三一重工、三一国际、三一重能&#xff09;&#xff0c;公司总资产超2000亿元&#xff0c;在国内12个省市设有生产基地&#xff0c;在海外建有印度、美国、德国、巴西四大研发制造基地&#xff0c;业…

【国产化信创平台】麒麟银河V10系统虚拟机创建

目录 一、麒麟V10系统镜像下载 二、虚拟机创建流程 三、麒麟银河系统安装流程 一、麒麟V10系统镜像下载 https://www.kylinos.cn/# 官方访问还是会有问题&#xff0c;如果有需要麒麟银河Kylin系统V10的镜像文件&#xff0c;可以留下邮箱或者私信博主获取。 二、虚拟机创…

【LeetCode】16. 最接近的三数之和

三数之和这道题被反复考到&#xff0c;但是我一次都没给写出来&#xff0c;真是汗颜&#xff01;本题是三数之和的一道变形题&#xff0c;也是一道好题&#xff01;本题有两个关键点&#xff1a;其一&#xff0c;双指针是怎么个用法&#xff1f;在本题中是怎么实现的&#xff1…

智慧的拼图:聚类分析的启示

文章目录 聚类分析简介K-means聚类什么是K-means聚类&#xff1f;K-means聚类的步骤K-means聚类的特点K-means聚类实例 层次聚类什么是层次聚类&#xff1f;层次聚类的类型层次聚类的步骤层次聚类的特点层次聚类实例 K-means与层次聚类对比相同点不同点 结论补充 聚类分析是数据…

【永洪BI】1.添加数据源

目录 一、添加文本数据源&#xff08;EXCEL&TEXT&#xff09; 二、添加Mysql数据源 一、添加文本数据源&#xff08;EXCEL&TEXT&#xff09; 略 二、添加Mysql数据源 1.添加Mysql驱动 2.问题&#xff1a; 问题① 原因&#xff1a; Jar文件上传校验&#xff0c;只允…

类静态方法将python 中把不同脚本融合为一个大脚本 互不影响的方法!首发 以便于维护和扩展。

一般遇见想要方便管理或者集合的大脚本 我们管理很麻烦 用这个方法 无论是什么方面的脚本 都能放在一个大脚本中运行 互不干扰。 将所有功能整合到一个单一的脚本中&#xff0c;而不再依赖外部的.py文件&#xff0c;你可以将rendering.py和sercurity.py中的函数代码直接复制到…

centos7 安装minio

文章目录 下载 Minio 二进制文件配置 Minio将Minio设置成服务 配置Systemd服务启动创建minio变量文件&#xff1a;/etc/default/minio创建Service File&#xff1a;/etc/systemd/system/minio.service设置开启自启动 Nginx反向代理nginx配置 下载 Minio 二进制文件 cd /usr/lo…

VLM系列文章6-Cambrian-1

以视觉为中心的多模态大模型Cambrian-1&#xff0c;主要考虑的是MLLM中视觉模型的影响。 1、评估 LLM 还是 MLLM&#xff1f;&#xff1a;我们在使用 23 种不同的视觉主干训练的 MLLM 中比较了视觉禁用和视觉启用设置之间的性能。我们的研究结果表明&#xff0c;MMMU 和 AI2D 等…

有没有视频ai换脸的软件?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 发现大家对AI换脸都非常感兴趣&#xff0c;AI换脸一般的步骤是&#xff1a;上传自己的照片→选择不同的风格→制作出被替换的GIF图或视…

安卓修改logo与开机动画后不显示问题解决

问题描述 替换安卓logo与开机动画bootanimation.zip画面是花的或黑的 修复步骤 手动替换安卓framework中的开机logo后显示异常排查 在电脑上打开logo图片, 查看分辨率, 再adb shell wm size查看设备的分辨率,要求二者一致.电脑上右键点击logo图片,查看属性,要确保它的位深度…

数据结构与算法 - 二分查找

一、二分查找 二分查找算法也称折半查找&#xff0c;是一种非常高效的工作于有序数组的查找算法。 时间复杂度 最坏情况&#xff1a;O(log n)最好情况&#xff1a;如果待查找元素恰好在数组中央&#xff0c;只需要循环一次O(1&#xff09; 空间复杂度 递归->O(log n)&a…

暑期C++ printf和scanf的平替

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 C中也有专门的输入和输出的方法 首先我们需要一个头文件&#xff0c;也就是#include<iostream> 然后根据我们命名空间的知识可知这个地方如果我们要使用必须先展开 可以全部展开比如using namespa…

K8s大模型算力调度策略的深度解析

随着大数据和人工智能技术的飞速发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;作为容器编排的领军者&#xff0c;在支撑大规模模型训练和推理方面扮演着越来越重要的角色。在大模型算力的调度过程中&#xff0c;如何高效、合理地分配和管理资源成为了一个亟待解决…

实验2-5-1 求排列数

本题要求实现一个计算阶乘的简单函数&#xff0c;使得可以利用该函数&#xff0c;根据公式 算出从n个不同元素中取出m个元素&#xff08;0<m≤n&#xff09;的排列数。 函数接口定义&#xff1a; double fact( int n );其中n是用户传入的参数&#xff0c;函数返回n的阶乘。…