this关键字、static关键字(静态变量、静态方法、静态代码块)、代码块、包

一、this关键字

1、使用区域:定义类时在类的方法中使用,包括构造方法和成员方法

2、特点:表示Java程序运行时正在调用此方法的对象

3、使用范围:

(1)引用当前对象中的成员变量

典例:用于区分变量名相同的成员变量和局部变量

  • 不使用this关键字,JVM会现在局部作用域查找局部变量,如果找到了,则使用所找到的变量,如果没找到,JVM会继续在成员变量作用域查找局部变量,如果找到了,则使用在成员变量作用域所找到的变量
public class Student {private String num;private String name;private int age;public Student(String num,String name,int age){num=num;name=name;age=age;}public static void main(String[] args) {Student student=new Student("111", "八戒",18);System.out.println(student.num);System.out.println(student.name);System.out.println(student.age);}
}

  •  使用this关键字
public class Student {private String num;private String name;private int age;public Student(String num,String name,int age){this.num=num;this.name=name;this.age=age;}public static void main(String[] args) {Student student=new Student("111", "八戒",18);System.out.println(student.num);System.out.println(student.name);System.out.println(student.age);}
}

 

 (2)引用当前对象中的构造方法

典例:为当前对象中的成员变量初始化默认值

public class Student {private String num;private String name;private int age;public Student(){this("222", "沙僧",19);}public Student(String num,String name,int age){this.num=num;this.name=name;this.age=age;}public static void main(String[] args) {Student student=new Student();System.out.println(student.num);System.out.println(student.name);System.out.println(student.age);}
}

(3)引用当前对象中的成员方法

public class Student {private String num;private String name;private int age;public Student(String num,String name,int age){this.num=num;this.name=name;this.age=age;}public void study(){System.out.println(this.name+"学习");this.exam();}public void exam(){System.out.println(this.name+"测试");}public static void main(String[] args) {Student student=new Student("333","三藏",20);student.study();}
}

4、注意:在一个类的定义中,方法或代码块中等号左边的变量如果加了this,则该变量为成员变量,等号左边如果没有加this,则该变量如果在该方法或代码块的作用域中定义,则该变量为局部变量,否则为成员变量

二、static关键字

1、定义

(1)static关键字表示静态,用static关键字修饰的成员是静态成员

(2)static关键字只能用来修饰类的成员变量、成员方法、代码块和内部类,不能用来修饰类的构造方法

2、特点

(1)静态成员信息与类信息(类对应的class文件/类的静态代码)一样,在内存中只有一份,都在类模版中,而类模版在JVM的方法区中

(2)静态成员与类同时加载

(3)静态成员先于对象存在

(4)静态成员被所有对象共享

(5)既可以用对象访问静态成员,也可以用类名访问静态成员,建议使用类名访问

3、静态变量

(1)定义:用static关键字修饰的成员变量就是静态变量

(2)使用时机:当类的所有对象的某个属性值性同时,则在类定义中将该成员变量定义为静态变量

举例:中国人的国籍都是中国,所以将中国人类的国籍属性用static修饰,定义为静态成员

public class Chinese {private String name;public static String country="中国";public static void main(String[] args) {System.out.println(Chinese.country);// 验证特点(3)Chinese chinese=new Chinese();System.out.println(chinese.country);Chinese chinese1=new Chinese();System.out.println(chinese1.country);//验证特点(4)chinese.country="中国中国";System.out.println(Chinese.country);Chinese.country="中国中国中国";System.out.println(chinese1.country);// 验证特点(5)}
}

(3)内存中静态变量的位置

4、静态方法

(1)定义:使用static关键字修饰的成员方法就是静态方法

(2)特点:静态方法中只能使用静态成员,包括静态变量和静态方法

(3)使用时机:如果在某个成员方法中未使用到非静态成员,则在类定义时将此方法定义为静态方法

(4)使用范围:在本类中的方法、代码块、构造器中一定可以被调用,在其他类中可以被调用(通过对象.静态方法或类名.静态方法的方式)

(4)举例:MyMath类中的max方法未使用成员变量,print方法未使用非静态成员变量,在类定义时将这两个方法定义为静态方法

public class MyMath {public static int count=0;public static int max(int a,int b){MyMath.print();// 在静态方法中使用静态方法return a>b?a:b;}public static void print(){MyMath.count++;// 在静态方法中使用静态变量System.out.println(MyMath.count);}public static void main(String[] args) {System.out.println(MyMath.max(3,4));// 在静态方法中使用静态成员System.out.println(new MyMath().max(3,4));// 验证特点(5)}
}

(5)注意:

  • 因为静态成员与类同时加载,所以static方法内不能有this和super
  • 在非静态方法中可以使用所有的成员变量

5、静态变量和静态方法在实际场景中的使用-模拟卖票

// 程序运行时,该类加载一次,在内存中只有一份,服务于某个影院的某个时间段的某场电影
public class TicketSeller {private static int ticket=10;// 该售票类所拥有的票数是一定的,无论开了几个售票窗口,卖的都是这份票,于是将票数属性定义为静态变量public static void sellTicket(){TicketSeller.ticket=TicketSeller.ticket-1;// 仅访问静态变量,定义为静态方法System.out.println("卖票方法一");}public static void sellTicket1(){TicketSeller.ticket=TicketSeller.ticket-1;// 仅访问静态变量,定义为静态方法System.out.println("卖票方法二");}public static void sellTicket2(){TicketSeller.ticket=TicketSeller.ticket-1;// 仅访问静态变量,定义为静态方法System.out.println("卖票方法三");}public static void main(String[] args) {TicketSeller.sellTicket();System.out.println("剩余票数为"+TicketSeller.ticket);TicketSeller.sellTicket1();System.out.println("剩余票数为"+TicketSeller.ticket);TicketSeller.sellTicket2();System.out.println("剩余票数为"+TicketSeller.ticket);}
}

四、代码块

1、定义:在类中定义的没有名称的方法体

2、分类:分为实例代码块和静态代码块两种

(1)实例代码块

  • 定义:在对象被创建时,被JVM调用的代码块
  • 语法格式:

{

任何符合语法的Java代码

  • 特点:每次对象被创建时都会被调用

(2)静态代码块

  • 定义:在类被加载时,被JVM调用的代码块
  •  语法格式:

static{

任何符合语法的Java代码

  • 只会在类被加载时调用一次,与对象是否被创建无关

3、类被加载的时刻

(1)通过类名访问静态成员时,该类会被加载

证明:

public class Demo {public static int count=0;public static void print(){System.out.println("静态方法"+"、"+"静态变量="+count);}static {System.out.println("静态代码块1");}static {System.out.println("静态代码块2");}}
public class Test {public static void main(String[] args) {System.out.println(Demo.count);Demo.print();}
}

结论:该例证明了通过类名访问静态成员时该类会被加载且只会加载一次

(2) 在一个类中使用main方法,该类也会被加载

证明:

public class Demo {public static int count=0;public static void print(){System.out.println("静态方法"+"、"+"静态变量="+count);}static {System.out.println("静态代码块1");}static {System.out.println("静态代码块2");}public static void main(String[] args) {}
}

(3)在一个类的对象被创建时该类会被加载

证明:

public class Demo {public static int count=0;public static void print(){System.out.println("静态方法"+"、"+"静态变量="+count);}static {System.out.println("静态代码块1");}static {System.out.println("静态代码块2");}
}
public class Test {public static void main(String[] args) {new Demo();new Demo();}
}

结论:该例证明了一个类的对象被创建时该类会被加载且只会加载一次 

4、对象被创建时实例代码块的执行

举例:

public class Demo {public static int count=0;public static void print(){System.out.println("静态方法"+"、"+"静态变量="+count);}{System.out.println("实例代码块1");}{System.out.println("实例代码块2");}
}
public class Test {public static void main(String[] args) {new Demo();new Demo();}
}

 

 结论:该例证明了对象被创建时实例代码块会被执行且对象被创建几次则实例代码块被执行几次

5、静态代码块、实例代码块、构造方法、静态方法执行的先后顺序

举例:

public class Demo {public static int count=0;public static void print(){System.out.println("静态方法"+"、"+"静态变量="+count);}public Demo(){System.out.println("构造方法");}{System.out.println("实例代码块2");}{System.out.println("实例代码块1");}static {System.out.println("静态代码块1");}static {System.out.println("静态代码块2");}
}
public class Test {public static void main(String[] args) {new Demo().print();new Demo().print();}
}

 

结论:

结论一:由该例可得,静态代码块、实例代码块、构造方法、静态方法的执行顺序为

(1)静态代码块

(2)实例代码块

(3)构造方法

(4)静态方法

结论二:多个同级代码块,按照类定义中的顺序依次执行

五、类定义中的成员变量与成员方法

1、成员变量

(1)非静态成员变量属于对象和类,每个对象都有一份,类中也有一份

(2)静态成员变量属于类,只有类中的一份,程序运行一次,内存中同一个类的类信息只有一份,在JVM内存中的方法区中的该类的类模版中

2、成员方法

(1)非静态成员方法,只能由对象调用,在方法体中可以使用任意的成员变量和成员方法

(2)静态成员方法,只能由对象和类名调用,在方法体中只能使用静态的成员变量和静态的成员方法

六、包

1、定义:包是Java为解决类名冲突和类文件管理难度大两个问题所引入的一种机制,用于提供类的多层命名空间,可以理解为是一个文件夹,在Java中用package关键字修饰包

2、特点:

(1)每个类属于一个特定的包,因此,类名(或者叫全类名)=包名(一个具体的类的地址)+类名简称

(2)当类名简称称为类名时,此时公式中的类名称为全类名

4、包的命名规范

在包名中,使用.号来区分包的级别,包名是小写,有四个级别

(1)第一级:表示项目类型。如com(商业项目),org(开源项目),gov(政府项目)等

(2)第二级:表示开发项目或者运行项目的公司的名称,如:sun,oracle,huawei,ali,ffyc等

(3)第三级:表示项目的名称,如bcms(业务连续性管理系统),oa(办公自动化),erp(企业资源计划),cms(内容管理系统)等

(4)第四级:表示项目功能模块的名称,如web(与前端对接),service(进行逻辑处理),dao(进行数据访问)等

5、关键字import-导入外部包中的类

(1)当在一个类中使用到其他包中的类时,需要先使用import关键字以全类名的形式将该类导进来

(2)特殊地,当在一个类中使用到java.lang包中的类时,不需要将该类导入进来

6、作用:

(1)避免多个类重名时出现问题

(2)按照功能的不同管理类

(3)控制访问权限

7、举例

(1)创建包

(2)定义类

package com.ffyc.bcms.dao;public class Car {private String brand;private int price;public Car(String brand,int price){this.brand=brand;this.price=price;}public void print(){System.out.println(this.brand+"品牌的"+this.price+"元的车");}
}
package com.ffyc.bcms.service;public class Car {private String brand;private String color;public Car(String brand,String color){this.brand=brand;this.color=color;}public void print(){System.out.println(this.brand+"品牌的"+this.color+"车");}
}
package com.ffyc.bcms.web;// 标识了该Test类所在的包import com.ffyc.bcms.service.Car;// 在Test类中使用到了其他包中的类Car,因此要将该Car类的全类名导入到该文件中来public class Test {public static void main(String[] args) {new Car("宝马","红色").print();}
}

(3)当在其他类中要使用到两个不同包中类名相同的类时,只能有一个类导入全类名之后以类名进行使用另一个类必须以以全类名进行使用

package com.ffyc.bcms.web;// 标识了该Test类所在的包import com.ffyc.bcms.service.Car;// 在Test类中使用到了其他包中的类Car,因此要将该Car类的全类名导入到该文件中来public class Test {public static void main(String[] args) {new Car("宝马","红色").print();new com.ffyc.bcms.dao.Car("奔驰", 66).print();}
}

 

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

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

相关文章

MySQL-事务、日志

事务 特性 原子性 是指事务开始后,必须成功执行完所有的操作才会结束,否则会回滚到事务刚开始前。 拿转账来说,一个成功的 A向B转账100元的过程 会涉及如下过程: A:从数据库读取A的余额;A的余额-100&am…

QT小细节

QT小细节 1 QTextToSpeech1.1 cmake1.2 qmake QT6 6.7.2 1 QTextToSpeech 从下图可以看到,分别使用qmake或者cmake编译情况下的,QTextToSpeech的使用方法 QTextToSpeech官方链接,也可以直接在QT Creator的帮助中搜索 1.1 cmake 将上图中的…

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…

微信小程序新建项目发现导航条不见了,及如何找回。

原因是现在小程序新建用的是 Skyline 渲染引擎 开启全局Skyline渲染引擎&#xff0c;因为Skyline不支持原生导航栏&#xff0c;所以就没显示原生导航栏了。 解决方法也很简单 app.json文件中的 “renderer”: “skyline”, 修改为 “renderer”:“webview”app.json文件中的…

CSS基础学习之元素定位(6)

目录 1、定位类型 2、取值 2.1、static 2.2、relative 2.3、absolute 2.4、fixed 2.5、stickty 3、示例 3.1、相对定位(relative) 3.2、绝对定位&#xff08;absolute&#xff09; 3.3、固定定位&#xff08;fixed&#xff09; 3.4、粘性定位&#xff08;sticky&…

大模型中的MoE是什么?

大模型中的MoE是什么&#xff1f; MoE&#xff08;Mixture of Experts&#xff09;是一种用于提高深度学习模型性能和效率的架构。其核心思想是通过引入多个专家&#xff08;Experts&#xff09;模型&#xff0c;每个输入数据只选择和激活其中的一部分专家模型来进行处理&…

nacos 适配瀚高数据库、ARM 架构

下载nacos源码&#xff1a; https://github.com/alibaba/nacos/tree/2.3.1 瀚高技术文档 1、修改pom.xml 根目录nacos-all > pom.xml<dependencyManagement><dependency><groupId>com.highgo</groupId><artifactId>HgdbJdbc</artifactI…

硅纪元视角 | 微软开发全新AI模型,革新电子表格处理效率!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

使用llama-cpp-python制作api接口

文章目录 概要整体操作流程技术细节小结 概要 使用llama-cpp-python制作api接口&#xff0c;可以接入gradio当中&#xff0c;参考上一节。 llama-cpp-python的github网址 整体操作流程 下载llama-cpp-python。首先判断自己是在CPU的环境下还是GPU的环境下。以下操作均在魔搭…

【Linux杂货铺】期末总结篇4:shell编程

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️什么是Shell脚本&#xff1f;二. ⛳️Shell 入门三. ⛳️Shell 变量3.1 &#x1f514;变…

Kotlin中Unit、Any和Nothing

Unit Unit是一个特殊的类型&#xff0c;它表示“没有意义的值”的单元类型。在Kotlin中&#xff0c;当你不需要函数返回任何具体值时&#xff0c;可以使用Unit类型。 和Java 中 void一样。 Any 所有非空类的父类 Any?所有类的父类 类似Java中Object Nothing 表示一个函数或…

旗晟巡检机器人的应用场景有哪些?

巡检机器人作为现代科技的杰出成果&#xff0c;已广泛应用于各个关键场景。从危险的工业现场到至关重要的基础设施&#xff0c;它们的身影无处不在。它们以精准、高效、不知疲倦的特性&#xff0c;担当起保障生产、守护安全的重任&#xff0c;为行业发展注入新的活力。那么&…

如何使用简鹿水印助手或 Photoshop 给照片添加文字

在社交媒体中&#xff0c;为照片添加个性化的文字已经成为了一种流行趋势。无论是添加注释、引用名言还是表达情感&#xff0c;文字都能够为图片增添额外的意义和风格。本篇文章将使用“简鹿水印助手”和“Adobe Photoshop”这两种工具给照片添加文字的详细步骤。 使用简鹿水印…

IDEA实现NPM项目的自打包自发布自部署

目录 前言 正文 操作背景 NPM自发布 Package自发布 NPM部署 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f…

射线和平面求交

射线和平面求交 1、平面方程 如果已知平面的高度&#xff08;即沿法向量方向的距离&#xff09;为 height&#xff0c;平面方程可以表示为&#xff1a; n ^ ⋅ p h e i g h t \bold{\hat{n}} \cdot p height n^⋅pheight p p p 是平面上的任意一点 height 的正负取决于法向量…

W外链创建抖音私信卡片教程,私信卡片跳转微信工具

W外链地址wai.cn 在数字化时代的浪潮中&#xff0c;私域流量的价值愈发凸显&#xff0c;成为企业获取用户、建立品牌忠诚度、提升转化率的关键手段。抖音&#xff0c;作为当下最热门的短视频社交平台之一&#xff0c;其用户基数庞大、互动性强&#xff0c;为企业私域引流提供了…

一些颜色的RGB整理

(214,219,233) (215,220,230) (189,189,189) (193,210,240) (190,210,240) (0,60,119) (0,60,120) (230,230,250)

初识Docker及管理Docker

Docker部署 初识DockerDocker是什么Docker的核心概念镜像容器仓库 容器优点容器在内核中支持2种重要技术&#xff1a;Docker容器与虚拟机的区别 安装Docker源码安装yum安装检查Docker Docker 镜像操作配置镜像加速器&#xff08;阿里系&#xff09;搜索镜像获取镜像查看镜像信息…

计算机网络技术期末复习

一. 填空 在采用电信号表达数据的系统中&#xff0c;数据有 数字数据 和 模拟数据 两种。域名系统DNS是一个 分布式数据库 系统。TCP/IP的网络层最重要的协议是 IP互连网协议&#xff0c;它可将多个网络连成一个互连网。 4. 在TCP/IP层次模型的网络层中包括的协议主要有ARP 、…

科技出海|百分点科技智慧政务解决方案亮相非洲展会

近日&#xff0c;华为非洲全联接大会在南非约翰内斯堡举办&#xff0c;吸引政府官员行业专家、思想领袖、生态伙伴等2,000多人参会&#xff0c;百分点科技作为华为云生态合作伙伴&#xff0c;重点展示了智慧政务解决方案&#xff0c;发表《Enable a Smarter Government with Da…