当前位置: 首页 > news >正文

类变量/方法、main语法、代码块

一.类变量和方法

思维导图概览:

1.1类变量(静态变量)

1.什么叫做类变量/方法?

——给类中的成员属性或成员方法加上static关键字进行修饰,类变量/方法也叫做静态变量/方法,静态变量/方法被类的自身所有对象所共享使用

 

2.一个小case快速了解类变量/方法

public class Test {public static void main(String[] args) {//静态属性可以直接使用类名访问,也可以使用对象名访问,但是遵守访问权限System.out.println(Animal.getAge());//18Animal jack = new Animal("jack");System.out.println(jack.getAge());//18}
}class Animal {//成员变量private String name;//类变量private static int age;public Animal(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}//静态方法public static int getAge() {age = 18;return age;}
}

 

3.类变量的内存布局

由图可知:

        1)static变量(静态变量)被类的所有对象共享,这些对象均属于同一个类

        2)静态变量,在类加载的时候就生成了

 

4.静态变量的定义和访问

1)静态变量的定义

        i.访问修饰符 static 数据类型 变量名;(推荐)

        ii.static 访问修饰符 数据类型 变量名;

2)静态变量的访问

        i.类名.静态变量名(推荐)

        ii.对象名.静态变量名

public class Test {public static void main(String[] args) {//访问静态变量的两种方式//类名.静态变量名//静态变量随着类的加载而创建,所有不需要使用创建对象去访问System.out.println("姓名:" + Animal.name + "年龄:" + Animal.age);//对象名.静态变量名Animal animal = new Animal();System.out.println("姓名:" + animal.name + "年龄:" + animal.age);}
}class Animal {//静态变量的两种定义方式//静态变量也需要遵守访问权限public static String name = "大黄"; //推荐使用这种方式static public int age = 18;
}

 

5.静态变量的细节讨论

1)什么时候需要使用静态变量?

当需要让所有对象都需要共享某一个变量的时候,那我们可以把这个变量设置为静态变量

2)静态变量和成员属性的区别

        i.静态变量被同类的所有对象共享

        ii.成员属性被每个对象独享,对象与对象之间的成员属性均独立

3)静态变量无需使用对象名访问,即没有创建对象,也能访问类变量

4)静态变量的生命周期随着类的加载而生成,随着类的销毁而消亡

public class Test {public static void main(String[] args) {//成员属性在每个对象之间均是独立的Person jack = new Person("jack", 18);Person marry = new Person("marry", 19);//静态变量赋值marry.setSalary(10000);System.out.println(jack.getSalary());//10000System.out.println(marry.getSalary());//10000}
}class Person {//成员属性private String name;private int age;//静态变量public static char gender = '男';//若是没有给静态变量赋值,应该提供一个set方法进行赋值private static double salary;//构造器public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}//方法public void setName(String name) {this.name = name;}public String getName() {return name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//若是静态变量是私有的,那我们提供get/set进行赋值和取值public void setSalary(double salary) {//为了区分两个salary,静态变量使用类名.salaryPerson.salary = salary;}public double getSalary() {return Person.salary;}
}

 

1.2类方法(静态方法)

1.静态方法的定义和访问

1)静态方法的定义

        i.访问修饰符 static 返回的数据类型 方法名(参数列表){};(推荐)

        ii.static 访问修饰符 返回的数据类型 方法名(参数列表){};

2)静态方法的访问方式

        i.使用类名.静态方法名访问

        ii.使用对象.静态方法名

public class Test {public static void main(String[] args) {//静态方法的访问形式//形式1:类名.静态方法名Person.say();Person.hi();//形式2:对象名.静态方法名Person person = new Person();person.say();person.hi();}
}class Person {//静态方法的定义方式//定义1:访问修饰符 static 返回的数据类型 方法名(形参列表) {}public static void say() {System.out.println("Hello,bro");}//定义2:static 访问修饰符 返回的数据类型 方法名(形参列表) {}static public void hi() {System.out.println("HI,bro");}
}

 

2.静态方法的使用场景

——当方法中不涉及任何和对象相关的成员,则可以设置为静态方法

注:工具类中的方法均为静态方法,提高了开发效率

 

3.静态方法的细节讨论

1)静态方法的加载和普通成员方法的加载均是随着类的加载而加载的,将结构信息存储在方法区

2)静态方法中不能使用this和super关键字,为什么?

        ——因为静态方法不需要创建对象就能访问,而this和super关键字需要对象才能使用

public class Test {public static void main(String[] args) {Stu.say();}
}class Person {public int age = 18;
}class Stu extends Person {//成员属性private String name = "jack";//构造器public Stu() {}//静态方法中不能使用this和super关键字public static void say() {//System.out.println("name=" + this.name);//System.out.println(super.age);System.out.println("Hello,bro");}
}

3)普通成员方法和静态方法的访问规则

        i.普通方法能访问静态属性和普通成员属性

        ii.静态方法只能访问静态属性

public class Test {public static void main(String[] args) {Person person = new Person();person.bye();Person.hi();}
}class Person {//注:方法和变量称为属性//普通成员变量private String name;private int age;//静态变量private static double salary = 10000.0;//普通成员方法public void say() {System.out.println("Hello");}//普通成员方法能访问静态属性和普通成员属性public void bye() {//普通成员属性say();//普通方法System.out.println(name);//普通成员System.out.println(age);//静态属性hi();//静态方法System.out.println(Person.salary);//静态变量}//静态方法只能访问静态属性public static void hi() {ok();//静态方法System.out.println(Person.salary);//静态变量//System.out.println(age);错误}public static void ok() {System.out.println("Ok~");}
}

 

 

二.main语法

思维导图概览:

1.什么是main方法?

——main方法是程序的主方法,一个程序只能有一个main方法,main方法是程序的入口

 

2.main方法的作用

——main方法的作用是为了Java虚拟机对程序的调用,main方法起了一个入口的作用

 

3.main方法的语法详解

public static void main(String[] args) {}

解释:

1)为什么需要pubic访问修饰符?

        ——因为Java虚拟机需要在类外调用main方法,所以main方法的访问权限必须是public

2)为什么需要static关键字?

        ——因为使用了static关键字后,我们不需要创建对象就能访问main方法

3)为什么需要使用void关键字?

        ——因为main方法我们不要求它给我们返回值,即是void

4)String[] args的作用是什么?

        ——String[] args接收命令行中的字符串

 

4.小tips

1)在main方法中,只能直接调用本类的静态属性,不能直接调用本类的非静态方法

2)不能直接调用的非静态属性,需要创建对象后访问

public class Test {private int age = 18;public static int sal = 10000;public static void main(String[] args) {//在main方法中可以直接访问静态属性System.out.println(sal);//main方法中需要创建对象后后才嫩访问成员属性Test test = new Test();System.out.println(test.age);}
}

 

 

三.代码块

思维导图概览:

1.什么是代码块?

——代码块属于类中的成员,是类的一部分,类似于方法,代码块将逻辑语句使用{}包括起来;代码块没有方法名,返回参数,参数列表,只有方法体,不能通过类的显示调用,只能隐式使用

 

2.代码块语法

语法:

(修饰符) {

        代码

};

注:

1)修饰符只有static可选

2)代码块分为静态代码块和普通代码块,静态代码块使用static修饰

3)代码块内可以写任何逻辑语句

4);号可写可不写

public class Test {public static void main(String[] args) {}
}class Person {//静态代码块static {System.out.println("静态代码块");}//普通代码块{System.out.println("普通代码块");}
}

 

3.代码块的优点

1)相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化操作

2)如果多个构造器中有相同的语句,可以抽取到代码块中去进行初始化,可以完成代码的重用性

 

4.一个小case快速了解代码块

public class Test {public static void main(String[] args) {Person person = new Person("jack", 18);}
}class Person {//成员变量private String name;private int age;//静态代码块static {System.out.println("静态代码块");//静态代码块}//普通代码块{System.out.println("普通代码块");//普通代码块}//构造器public Person(String name, int age) {System.out.println("构造器器初始化~");//构造器器初始化~this.name = name;this.age = age;}//方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

 

5.代码块的细节讨论

1)static修饰的代码块叫做静态代码块,作用是对类进行初始化,它随着类的加载而执行,只会执行一次

2)实例代码块的执行随着对象的创建就会执行,有几个对象则执行几次实例代码块

public class Test {public static void main(String[] args) {//创建了四个对象:静态代码块只会执行一次,普通代码块有几个对象则执行几次//输出一次静态代码块,输出四次普通代码块Person p = new Person();Person p1 = new Person();Person p2 = new Person();Person p3 = new Person();}
}class Person {//静态代码块static {System.out.println("静态代码块");//静态代码块}//普通代码块{System.out.println("普通代码块");//普通代码块}
}

3)类在什么时候进行加载?

        i.创建对象实例的时候进行类的加载

        ii.创建子类对象实例,父类也会被进行加载,先加载父类

        iii.使用静态成员时进行类加载

public class Test {public static void main(String[] args) {//注:每个测试用例单独测试//创建对象实例的时候进行类的加载//Person person = new Person("jack",18);//输出:父类的静态代码块~   父类的普通代码块~   父类的构造器~//创建子类对象实例,先进行父类和子类的静态代码块,然后进行加载父类,再加载父类//Stu stu = new Stu("marry",16);//输出:父类的静态代码块~  子类的静态代码块~  父类的普通代码块~  父类的构造器~  子类的普通代码块~  子类的构造器~//使用静态成员时进行类加载System.out.println(Stu.gender);//输出:父类的静态代码块~  子类的静态代码块~  男}
}class Person {//成员属性private String name;private int age;//静态代码块static {System.out.println("父类的静态代码块~");}//普通代码块{System.out.println("父类的普通代码块~");}//构造器public Person(String name, int age) {System.out.println("父类的构造器~");this.name = name;this.age = age;}//方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Stu extends Person {//静态变量public static char gender = '男';public Stu(String name, int age) {super(name, age);System.out.println("子类的构造器~");}//静态代码块static {System.out.println("子类的静态代码块~");}//普通代码块{System.out.println("子类的普通代码块~");}
}

4)在单个类中,创建一个对象时,类的调用顺序如下:

        i.先调用静态成员初始化,静态代码块、静态属性的优先级一样,先定义的先调用

        ii.然后调用普通代码块和普通成员属性初始化,优先级相同,先定义的先调用

        iii.最后调用构造器

public class Test {public static void main(String[] args) {Person jack = new Person("jack", 18);//输出:父类的静态代码块~  父类的普通代码块~  父类的构造器~}
}class Person {//1)在类中先调用静态成员初始化,静态代码块、静态属性的优先级一样,先定义的先调用//静态成员public static char gender = '男';//静态代码块static {System.out.println("父类的静态代码块~");}//2)调用普通代码块和普通成员属性初始化,优先级相同,先定义的先调用//成员属性private String name;private int age;//普通代码块{System.out.println("父类的普通代码块~");}//3)调用构造器//构造器public Person(String name, int age) {System.out.println("父类的构造器~");this.name = name;this.age = age;}//方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

5)构造器前面隐含了super和普通代码块的调用,执行顺序: super > 普通代码块 > 构造器

public class Test {public static void main(String[] args) {Stu stu = new Stu();//输出:父类的普通代码块~  父类的构造器~  子类的普通代码块~  子类的构造器~}
}//父类
class Person {//代码块{System.out.println("父类的普通代码块~");}//构造器public Person() {System.out.println("父类的构造器~");}
}//子类
class Stu extends Person {//代码块{System.out.println("子类的普通代码块~");}//构造器public Stu() {System.out.println("子类的构造器~");}
}

6)当存在继承关系的时候,子类创建对象后,类的调用顺序为:

        前提:成员 = 成员变量 + 成员方法

        i.调用父类的静态成员对类进行初始化,若有多个静态成员,则按照定义顺序优先

        ii.调用子类的静态成员对类进行初始化,若有多个静态成员,则按照定义顺序优先

        iii.调用父类普通成员对类进行初始化,若有多个普通成员,则按照定义顺序优先

        iv.调用父类的构造器

        v.调用子类普通成员对类进行初始化,若有多个普通成员,则按照定义顺序优先

        vi.调用子类的构造器

public class Test {public static void main(String[] args) {Stu stu = new Stu();//输出:父类的静态代码块~  子类的静态代码块~  父类的普通代码块~ 父类的构造器~  子类的普通代码块~  子类的构造器~}
}class Person {//代码块static {System.out.println("父类的静态代码块~");}{System.out.println("父类的普通代码块~");}//构造器public Person() {System.out.println("父类的构造器~");}
}class Stu extends Person {//代码块static {System.out.println("子类的静态代码块~");}{System.out.println("子类的普通代码块~");}//构造器public Stu() {System.out.println("子类的构造器~");}
}

7)静态代码块只能调用静态属性,普通代码块可以任意调用

public class Test {public static void main(String[] args) {}
}class Person {//静态成员变量private static int id = 52213234;//静态代码块static {//静态代码块只能调用静态成员//say();//错误hi();System.out.println(id);}//普通代码块{//普通代码块能调用任意成员System.out.println(Person.id);say();Person.hi();}//普通方法public void say() {System.out.println("普通say()方法~");}//静态方法public static void hi() {System.out.println("静态hi()方法~");}
}

相关文章:

类变量/方法、main语法、代码块

一.类变量和方法 思维导图概览: 1.1类变量(静态变量) 1.什么叫做类变量/方法? ——给类中的成员属性或成员方法加上static关键字进行修饰,类变量/方法也叫做静态变量/方法,静态变量/方法被类的自身所有对…...

[SHCTF 校外赛道] crypto

终于都结束了,这些新生赛太漫长了。不过这个也还是有些难度的,好多整不来。抓紧时间整理一下。 week1 第1周基本是古典密码,古典和现代最大的区别是古典全靠猜,现在都是数学 立正 wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBi…...

vue3从基础到入门(一)

文章目录 简介提升使用创建脚手架vite 常用Composition APIsetuprefreactive函数响应式vue2响应式vue3实现响应式 reactive对比ref注意计算属性computed函数 监视watch函数watchEffect函数 生命周期hook函数toRef 简介 2020年9月18日,Vue.js发布3.0版本&#xff0c…...

枚举类型 表示不同的 HTTP 状态码和相应的错误消息

java web业务中经常用常量来表示不同的 HTTP 响应状态,比如 public enum AppHttpCodeEnum {// 成功段0SUCCESS(200,"操作成功"),// 登录段1~50NEED_LOGIN(1,"需要登录后操作"),LOGIN_PASSWORD_ERROR(2,"密码错误"),// TOKEN50~100TOKEN_INVALID…...

SAP 使用cl_gui_timer自动刷新屏幕的用法详解 <转载>

原文链接:https://blog.csdn.net/SAPmatinal/article/details/130483382 SAP 使用cl_gui_timer自动刷新屏幕的用法详解 这个类在初始化的时候会设置一个定时间隔,每隔这个时间就会触发一次FINISHED事件。利用这个类的特性,可以实现很多东西&…...

golang中的Interface接口 类型断言、接口赋值、空接口的使用、接口嵌套

Interface整理 文章目录 Interface整理接口嵌套接口类型断言类型判断 type-switch使用方法集与接口空接口实例 接口赋值给接口 接口是一种契约,实现类型必须满足它,它描述了类型的行为,规定类型可以做什么。接口彻底将类型能做什么&#xff0…...

使用设计模式省去大量的if-elsef分支

1.测试类 Testpublic void test7() {/*** 使用设计模式前*///模拟入参String name "?";if("张三".equals(name)){System.out.println("按照张三的策略执行的任务!");}else if ("李四".equals(name)){System.out.println("按照李…...

Tomcat安装与配置文件解读

简介 Tomcat是Apache软件基金会(Apache Software Foundation)项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在…...

计算机网络重点概念整理-第一章 计算机网络概述【期末复习|考研复习】

计算机网络复习系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言一、计算机网络概述1.1 计算机网络的定义:1.2 计算机网…...

Day 11 python学习笔记

模块 内置模块 random random:随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法: random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…...

HarmonyOS鸿蒙原生应用开发设计- 图标库

HarmonyOS设计文档中,为大家提供了独特的图标库,开发者可以根据需要直接引用。 图标库可以分为双色图标、填充图标、线性图标。具体分为 键盘、箭头、连接状态、媒体、人、设备、索引、通信、文件、物体与工具等。 整体分类 开发者直接使用官方提供的图标…...

微软bing大声朗读文档或网页卡顿老是中断,用离线的huihui就很流畅但没那么自然

默认的xiaoxiao_online好听,但卡顿,朗读功能确实受到了网络状态的影响。 大概率是网络问题。...

Java VMTranslator Part I

目录 堆栈运算命令 基本思路 核心代码 Parser Code Writer Main 实验结果,使用SimpleAdd、StackTest进行验证 内存访问命令 基本思路 核心代码 Parser Code Writer Main 实验结果,使用进行验证。对比生成的二进制代码文件。 用Java写一个翻…...

ES6带来那些js新特性?

ECMAScript 6(ES6),也称为 ECMAScript 2015,引入了许多重大的改进和新特性,以改善JavaScript语言的功能和可读性。以下是一些ES6中的主要改变和新特性: 1、let 和 const 声明: 引入了 let 和 const 关键字…...

js数组深拷贝汇总

1.for 循环实现数组的深拷贝 通过对数组的for循环&#xff0c;即可实现对数组的深拷贝了。 var arr [1,2,3,4,5] var arr2 copyArr(arr) function copyArr(arr) {let res []for (let i 0; i < arr.length; i) {res.push(arr[i])}return res }2.slice 方法实现数组的深…...

错误 LNK1112 模块计算机类型“x64”与目标计算机类型“X86”冲突

这个错误表明你在进行链接时&#xff0c;模块的计算机类型与目标计算机类型冲突。 在这里&#xff0c;“x64”代表64位系统&#xff0c;“X86”代表32位系统。 要解决这个问题&#xff0c;你需要确保你的所有模块&#xff08;包括库文件和依赖项&#xff09;都是与你的目标计…...

java八股文(基础篇)

面向过程和面向对象的区别 面向过程&#xff1a;在解决问题时&#xff0c;特别自定义函数编写一步一步的步骤解决问题。 面向对象&#xff1a;其特点就是 继承&#xff0c;多态&#xff0c;继承&#xff0c;在解决问题时&#xff0c;不再注重函数的编写&#xff0c;而在于注重…...

window系统修改rabbitmq 默认端口

安装完rabbitmq之后&#xff0c;默认的client端口是5672, 控制台访问端口是15672&#xff0c;rabbitmq管理工具启动之后在浏览器中输入地址&#xff1a; ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​&#xff0c; 默认管理员账号&#xff1a;guest 密码&#x…...

七人拼团模式:颠覆你的购物观念,499元产品让你赚翻天!

七人拼团模式是一种创新的消费模式&#xff0c;通过聚集消费者的购买力&#xff0c;让消费者能够以更优惠的价格购买到优质的商品。下面我们以499元的产品为例&#xff0c;详细介绍七人拼团模式的玩法规则和收益计算。 玩法规则&#xff1a; 消费者购买499元的指定产品后&…...

【机器学习合集】模型设计之卷积核设计 ->(个人学习记录笔记)

文章目录 卷积核设计1. 基于参数压缩的卷积设计1.1 【11卷积】1.2 【11卷积典型应用】1.3 【小卷积的使用】 2. 基于感受野的卷积设计2.1 膨胀卷积(带孔卷积&#xff0c;strous convolution)2.2 可变形卷积2.3 非局部卷积 3. 基于卷积操作的优化3.1 移位网络3.2 加法网络 卷积核…...

JS实现用户二次确认后再提交表单

HTML代码 <form id"importForm" action"" method"post" enctype"multipart/form-data" onsubmit"return confirmSubmit()"> ...... <input id"btnImportSubmit" class"btn btn-primary" type…...

1992-2021年全国各省经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;31省 4、指标解释&…...

JMeter的使用——傻瓜式学习【中】

目录 前言 1、JMeter参数化 1.1、什么是参数化 1.2、用户定义的变量 1.2.1、什么时候使用用户定义的变量 1.2.2、使用“用户定义的变量”进行参数化的步骤&#xff1a; 1.2.3、案例 1.3、用户参数 1.3.1、什么时候使用用户参数&#xff1f; 1.3.2、使用“用户参数”进…...

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能&#xff0c;由于别的数据库有值&#xff0c;需要这边的不同入口的进来查询&#xff0c;所以需要同步过来&#xff0c;如果再继续一个一个生成列对应处理感觉不方便&#xff0c;如果没有别的操作&#xff0c;只是存储和查询&#xff0c;那就可以用MySql支持的jso…...

动态规划14:一和零

动态规划14&#xff1a;一和零 题目 474. 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 …...

C#WPF嵌入字体实例

本文介绍C#WPF嵌入字体实例。 首先创建项目 添加Resources文件夹,添加字体文件,字体文件属性:生成操作为Resources,复制到输出目录:不复制 字体的使用可以采用以下两种方法: 方式一 直接引用 FontFamily="./Resources/#幼圆" 方式二 定义资源 <Applica…...

Linux——Linux权限

Linux权限 前言一、shell命令以及运行原理二、Linux权限的概念Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法 file指令目录的权限粘滞位 总结 前言 linux的学习…...

android中gradle的kotlin编译配置选项

一、编译配置 1、Android中的配置 使用如下方式开启在Android中的gradle的kotlin编译配置&#xff1a; 该配置在其余平台不可用 android {...compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}kotlinOptions {jvmTar…...

【知识串联】概率论中的值和量(随机变量/数字特征/参数估计)【考研向】【按概率论学习章节总结】(最大似然估计量和最大似然估计值的区别)

就我的概率论学习经验来看&#xff0c;这两个概念极易混淆&#xff0c;并且极为重点&#xff0c;然而&#xff0c;在概率论的前几章学习中&#xff0c;如果只是计算&#xff0c;对这方面的辨析不清并没有问题。然而&#xff0c;到了后面的参数估计部分&#xff0c;却可能出现问…...

NOIP2023模拟6联测27 点餐

题目大意 有 n n n样菜品&#xff0c;每样菜品都有两个权值 a i a_i ai​和 b i b_i bi​&#xff0c;如果你选择了 k k k个菜品&#xff0c;分别为 p 1 , … , p k p_1,\dots,p_k p1​,…,pk​&#xff0c;则你的花费为 ∑ i 1 k a p i max ⁡ i 1 k b p i \sum\limits_{i…...