Java开发从入门到精通(九):Java的面向对象OOP:成员变量、成员方法、类变量、类方法、代码块、单例设计模式
Java大数据开发和安全开发
- (一)Java的变量和方法
- 1.1 成员变量
- 1.2 成员方法
- 1.3 static关键字
- 1.3.1 static修饰成员变量
- 1.3.1 static修饰成员变量的应用场景
- 1.3.1 static修饰成员方法
- 1.3.1 static修饰成员方法的应用场景
- 1.3.1 static的注意事项
- 1.3.1 static的应用知识:代码块
- 静态代码块
- 实例代码块
- 1.3.1 static的应用知识:单例设计模式
- 懒汉式单例设计模式
- 1.4 final关键字
(一)Java的变量和方法
1.1 成员变量
待补充
1.2 成员方法
待补充
1.3 static关键字
static关键字的概念:
静态的意思,可以修饰成员变量、成员方法。
1.3.1 static修饰成员变量
成员变量按照有无static修饰,分为两种:
-
类变量
-
实例变量(对象的变量)
-
类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
-
实例变量(对象的变量): 无static修饰,属于每个对象的
public class Student {// 类变量static String name;// 实例变量(对象的变量)int age;}
public class Test {public static void main(String[] args) {// 目标:掌握有无static修饰成员变量的用法,特点。// 1、类变量的用法。// 类名.类变量(推荐)Student.name ="袁华";// 对象.类变量(不推荐)Student s1 = new Student();s1.name ="马冬梅"; //会被类的全部对象共享Student s2 = new Student();s2.name="秋雅"; //会被类的全部对象共享System.out.println(s1.name);// 秋雅System.out.println(Student.name);// 秋雅//2、实例变量的用法:属于每个对象的变量// 对象.实例变量s1.age = 23;s2.age = 18;System.out.println(s1.age);//23}
}
成员变量的执行原理
1.3.1 static修饰成员变量的应用场景
类变量的应用场景
- 在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住
案例导学:
- 系统启动后,要求用户类可以记住自己创建了多少个用户对象了
public class User {// 类变量public static int number;public User(){// User.number++;// 注意:在同一个类中,访问自己类的类变量,才可以省略类名不写。number++;}
}
public class Test2 {public static void main(String[] args) {// 目标:通过案例理解类变量的应用场景、User ul = new User();User u2 = new User();User u3 = new User();User u4 = new User();System.out.println(User.number);}
}
1.3.1 static修饰成员方法
成员方法的分类
- 类方法 :有static修饰的成员方法,属于类。(也叫静态方法)
- 实例方法 :无static修饰的成员方法,属于对象
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 Test {public static void main(String[] args) {// 目标:掌握有无static修饰方法的用法。// 1、类方法的用法// 类名.类方法(推荐)Student.printHelloWorld();// 对象.类方法(不推荐)Student s= new Student();s.printHelloWorld();// 2、实例方法的用法// 对象.实例方法s.printPass();// Student.printPass();// 报错 不能使用类名访问实例方法}
}
成员方法的执行原理
搞懂main方法
main方法使用static修饰也就说明main方法是类方法,Test.class在运行时会直接执行Test.main方法,所以main可以直接运行不需要别人调用,String[] args 代表main方法可以传参的,怎么传呢?看下面
这里我们用txt写了一段循环的代码 使用java编译来运行
java在编译执行的时候可以按照参数的类型直接传参,这是就是main方法的传参
1.3.1 static修饰成员方法的应用场景
- 类方法最常见的应用场景是做工具类
工具类是什么?
- 工具类中的方法都是一些类方法,每个方法都是用来完成一个功能的,工具类是给开发人员共同使用的。
使用类方法来设计工具类有啥好处?
- 提高了代码复用;调用方便,提高了开发效率
类方法应用场景案例
- 某系统登录页面需要四位数的验证码 注册页面需要六位数的验证码
登录页面写一次生成验证码的代码 注册页面再写一次 代码重复率很高
所以使用工具类来简化代码
import java.util.Random;public class GongJuLei {public static String CreateCode(int n){String code ="";String data = "abcdefghijklmnopqrstuVwXyZABCDEFGHIJKLMNOPORSTUVWXYZ0123456789";Random r =new Random();// 2、开始定义一个循环产生每位随机字符for(int i=0;i<n;i++){// 3、随机一个字符范围内的索引。int index = r.nextInt(data.length());// 4、根据索引去全部字符中提取该字符code += data.charAt(index);//code =code +字符}return code;}
}
public class Reg {public static void main(String[] args) {//注册页面GongJuLei.CreateCode(6);}
}
public class Reg {public static void main(String[] args) {//注册页面GongJuLei.CreateCode(6);}
}
为什么工具类中的方法要用类方法,而不用实例方法?
- 实例方法需要创建对象来调用,此时对象只是为了调用方法,对象占内存,这样会浪费内存。
- 类方法,直接用类名调用即可,调用方便,也能节省内存。
多学一招:
- 工具类没有创建对象的需求,建议将工具类的构造器进行私有
- 使用工具类无需再创建对象,直接用类名调用,为了不让别人创建对象可以私有化构造器,这样在实例化对象时调用不了无参构造器就会失败
private GongJuLei(){}
1.3.1 static的注意事项
- 类方法中可以直接访问类的成员,不可以直接访问实例成员
- 实例方法中既可以直接访问类成员,也可以直接访问实例成员
- 实例方法中可以出现this关键字,类方法中不可以出现this关键字的
- 实例方法中可以直接访问当前类的私有成员
public class Student {static String schoolName;//类变量double score;//实例变量//1、类方法中可以直接访问类的成员,不可以直接访问实例成员public static void printHelloWorld() {// 注意:同一个类中,访问类成员,可以省略类名不写、Student.schoolName = "黑马";Student.printHelloWorld2();schoolName = "黑马";//可以省略类名不写、printHelloWorld2();//可以省略类名不写、//System.out.println(score);// 报错的 不可以直接访问实例成员//printPass();//报错的 不可以直接访问实例方法//System.out.println(this);报错的 不可以直接访问this}//类方法public static void printHelloWorld2() {}//2、实例方法中既可以直接访问类成员,也可以直接访问实例成员// 实例方法public void printPass(){schoolName ="黑马2";//访问类成员printHelloWorld2();//访问类方法System.out.println(this); //可以直接访问this}
}
1.3.1 static的应用知识:代码块
代码块概述
- 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)
代码块分为两种:
-
静态代码块
格式:static{}特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次作用:完成类的初始化,例如:对类变量的初始化赋值。
-
实例代码块
格式:{}特点:每次创建对象时,执行实例代码块,并在构造器前执行。作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值
静态代码块
public class Student {static int number =80;static String schoolName;// 静态代码块static {System.out.println("静态代码块执行了~~");schoolName =“黑马";// 初始化赋值}// 实例代码块{System.out.println("实例代码块执行了~~");}public student(){System.out.println("无参数构造器执行了~~")}public student(String name){System.out.println("有参数构造器执行了~~");}
}
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);//System.out.println("---------------")Student sl =new Student();Student s2 =new Student(name:"张三");
实例代码块
每次创建对象时,执行实例代码块,并在构造器前执行 构造器也是创建对象时执行
public class Student {static int number =80;static String schoolName;// 静态代码块// 实例代码块{System.out.println("实例代码块执行了~~");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){// 目标:认识两种代码块,了解他们的特点和基本作用。 System.out.println("---------------")Student sl =new Student(); Student s2 =new Student(name:"张三");
实例代码块执行了~~
无参数构造器执行了~~
实例代码块执行了~~
有参数构造器执行了~~
1.3.1 static的应用知识:单例设计模式
什么是设计模式(Design pattern)
- 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式
关于设计模式的学习,主要学什么?
单例设计模式
- 确保一个类只有一个对象。
写法
- 把类的构造器私有。
- 定义一个类变量记住类的一个对象。
- 定义一个类方法,返回对象。
public class A{// 2、定义一个类变量记住类的一个对象private static Aa= new A();//1、必须私有类的构造器private A(){}//3、定义一个类方法返回类的对象public static A getobject(){return a;}
}
public class Test1{public static void main(String[] args){// 目标:掌握单例设计模式的写法。A a1 = A.getobject();A a2 = A.getobject();System.out.println(a1);System.out.println(a2);}
}
com.itheima.d6_singleInstance.A@776ec8df
com.itheima.d6_singleInstance.A@776ec8df
单例模式的应用场景和好处?
- 任务管理器对象、获取运行时对象。
- 在这些业务场景下,使用单例模式,可以避免浪费内存。
- 饿汉式单例:拿对象时,对象早就创建好了,
- 懒汉式单例:拿对象时,才开始创建对象,
懒汉式单例设计模式
- 拿对象时,才开始创建对象
public class B{// 2、定义一个类变量,用于存储这个类的一个对象。private static B b;// 1、把类的构造器私有private B(){}//13、定义一个类方法,这个方法要保证第一次调用时才创建一个对象,后面调用时都会用这同一个对象返回。public static B getInstance(){if(b == null){b = new B();}return b;}
}
public class Test2 {public static void main(string[] args){B b1=B.getInstance();// 第一次拿对象B b2 =B.getInstance();System.out.println(b1 == b2);}
}
单例模式是用饿汉模式还是懒汉模式呢?
- 如果写的单例模式经常用 就使用饿汉模式
- 如果写的单例模式不常用就用懒汉模式 节省内存
1.4 final关键字
final 关键字是最终的意思,可以修饰(类、方法、变量)
- 修饰类:该类被称为最终类,特点是不能被继承了
- 修饰方法:该方法被称为最终方法,特点是不能被重写了
- 修饰变量:该变量只能被赋值一次。
// 1、final修饰类,类不能被继承了
final class A{}
//class B extends A {}
// 2、final修饰方法,方法不能被重写了
class C{public final void test()
}
class D extends C{@0verridepublic void test(){ //报错 }
}
public class Test{/*** 常量 : public static final 修饰的成员变量,建议名称全部大写,多个单词下划线连接*/public static final String SCHOOL_NAME ="黑马";private final String name ="猪八戒";// 这种用法没有意义,知道就行public static void main(string[] args){// 目标:认识final的作用。// 3、final可以修饰变量总规则:有且仅能赋值一次/*变量:1.局部变量2.成员变量:1、静态成员变量2、实例成员变量*/final int a;a= 12;//a=13;// 第二次赋值,出错了final double r= 3.14;//r=0.1;// 第二次赋值,出错了// schoolName =“白马";// 第二次赋值,出错了}public static void buy(final double z){//z= 0.1;// 第二次赋值,出错了}
}
final修饰变量的注意
- final修饰基本类型的变量,变量存储的数据不能被改变
- final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
final int[]arr ={11,22,33};
// arr = null;// 第二次赋值,出错了
arr[1]= 222;
常量
使用了 static final修饰的成员变量就被称为常量,
作用:通常用于记录系统的配置信息。
使用常量记录系统配置信息的优势、执行原理
代码可读性更好,可维护性也更好。
程序编译后,常量会被“宏替换”: 出现常量的地方全部会被替换成其记住的字面量这样可以保证使用常量和直接用字面量的性能是一样的。
public class Test2 {public static final String SCHOOL_NAME ='"黑马程序员黄埔班"public static void main(string[l args){// 目标:认识常量。System.out.println(SCHOOL_NAME);System.out.println(SCHOOL_NAME);System.out.println(SCHOOL_NAME);System.out.println(SCHOOL_NAME);System.out.println(SCHOOL NAME);System.out.println(SCHOOL NAME);}
}
相关文章:

Java开发从入门到精通(九):Java的面向对象OOP:成员变量、成员方法、类变量、类方法、代码块、单例设计模式
Java大数据开发和安全开发 (一)Java的变量和方法1.1 成员变量1.2 成员方法1.3 static关键字1.3.1 static修饰成员变量1.3.1 static修饰成员变量的应用场景1.3.1 static修饰成员方法1.3.1 static修饰成员方法的应用场景1.3.1 static的注意事项1.3.1 static的应用知识…...

通过 Socket 手动实现 HTTP 协议
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...

探索数据结构:双向链表的灵活优势
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 前言 前面我们学习了单链表,它解决了顺序表中插入删除需…...

记录一次服务器内存使用率过高达到90%告警问题排查。
目录 一、前言二、问题排查处理三、 结尾 👩🏽💻个人主页:阿木木AEcru 🔥 系列专栏:Docker容器化部署系列 💹每一次技术突破,都是对自我能力的挑战和超越。 一、前言 一大早就有一…...

基于react native的自定义轮播图
基于react native的自定义轮播图 效果示例图示例代码 效果示例图 示例代码 import React, {useEffect, useRef, useState} from react; import {Animated,PanResponder,StyleSheet,Text,View,Dimensions, } from react-native; import {pxToPd} from ../../common/js/device;c…...
Jetson入坑记实
关于虚拟环境python与系统自带python目录下dist-packages与site-packages dist-packages:系统自带的python site-packages:自己安装的python 详细:dist-packages与site-packages_dist-packages和site-packages-CSDN博客 rtsp获取视频流(没…...

算法系列--递归
一.如何理解递归 递归对于初学者来说是一个非常抽象的概念,笔者在第一次学习时也是迷迷糊糊的(二叉树遍历),递归的代码看起来非常的简洁,优美,但是如何想出来递归的思路或者为什么能用递归这是初学者很难分析出来的 笔者在学习的过程中通过刷题,也总结出自己的一些经验,总结来…...

【JS】替换文本为emjio表情
最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心],[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例:(el.outerHTML),将el元素转文本字符串replaceAll…...
Solr完结版
Solr是基于Apache Lucene构建的用于搜索和分析的开源解决方案。提供可拓展索引、搜索功能、高亮显示和文字解析功能。本质是一个java web项目,内嵌Jetty服务器,安装方便。 请求Solr中的控制器,处理完数据后把结果相应给客户端 正向索引&#…...

外包干了5天,技术退步明显。。。。
说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…...

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展
在一项旨在显著改善 DeFi 生态的战略举措中,Cronos 与 Covalent Network(CQT)携手合作,以期待 Cronos zkEVM 的推出。这一整合,预计将进一步降低以太坊生态系统的交易成本、提升交易速度,并带来更好的交易体…...

基于SpringBoot的高校办公室行政事务管理系统
采用技术 基于SpringBoot的高校办公室行政事务管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 功能清单 教师信息管理 办公室管理 办公物资管…...
Linux系统及操作 (04)
Linux系统及操作 (03) RPM 软件包 网络下载对应软件包光盘镜像文件,具备软件包 Windows 系统软件包的管理 可以指定安装位置安装是集中安装到一个目录Linux 系统 与 Windows 系统相反。 常见的软件包(生态)类型 电脑入侵99%都是通过软件…...
粒子群算法 - 目标函数最优解计算
粒子群算法概念 粒子群算法 (particle swarm optimization,PSO) 由 Kennedy 和 Eberhart 在 1995 年提出,该算法模拟鸟群觅食的方法进行寻找最优解。基本思想:人们发现,鸟群觅食的方向由两个因素决定。第一个是自己当初飞过离食物…...

关于MySQL数据库的学习3
目录 前言: 1.DQL(数据查询语言): 1..1基本查询: 1.2条件查询: 1.3排序查询: 1.3.1使用ORDER BY子句对查询结果进行排序。 1.3.2可以按一个或多个列进行排序,并指定排序方向(升序ASC或降序DESC&#…...
笔试题——得物春招实习
开幕式排练 题目描述 导演在组织进行大运会开幕式的排练,其中一个环节是需要参演人员围成一个环形。演出人员站成了一圈,出于美观度的考虑,导演不希望某一个演员身边的其他人比他低太多或者高太多。 现在给出n个参演人员的身高,问…...

动手做简易版俄罗斯方块
导读:让我们了解如何处理形状的旋转、行的消除以及游戏结束条件等控制因素。 目录 准备工作 游戏设计概述 构建游戏窗口 游戏方块设计 游戏板面设计 游戏控制与逻辑 行消除和计分 判断游戏结束 界面美化和增强体验 看看游戏效果 准备工作 在开始编码之前…...

【极简无废话】open3d可视化torch、numpy点云
建议直接看文档,很多都代码老了,注意把代码版本调整到你使用的open3d的版本: https://www.open3d.org/docs/release/tutorial/visualization/visualization.html 请注意open3d应该已经不支持centos了! 从其他格式转换成open3d…...

C语言经典算法-6
文章目录 其他经典例题跳转链接31.数字拆解32.得分排行33.选择、插入、气泡排序34.Shell 排序法 - 改良的插入排序35.Shaker 排序法 - 改良的气泡排序 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官(一&…...

【计算机考研】杭电 vs 浙工大 怎么选?
想求稳上岸的话,其他几所学校也可以考虑,以留在本地工作的角度考虑,这几所学校都能满足你的需求。 如果之后想谋求一份好工作,肯定优先杭电是比较稳的,当然复习的时候也得加把劲。 这个也可以酌情考虑,报…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...