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的应用知识:单例设计模式
        • 懒汉式单例设计模式

(一)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);
	}
}

单例模式是用饿汉模式还是懒汉模式呢?

  • 如果写的单例模式经常用 就使用饿汉模式
  • 如果写的单例模式不常用就用懒汉模式 节省内存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于暗通道的图像去雾算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

MongoDB简单CRUD操作(含GO中的库操作)

MongoDBCRUD操作&#xff08;含GO中的库操作&#xff09; 这周开始尝试做新项目&#xff0c;涉及到了文章的存储&#xff0c;查了查MongoDB在这方面用的比较多&#xff0c;因此对MongoDB和他在Golang中的用法进行了学习&#xff0c;以下是我的整理 文章目录 MongoDBCRUD操作&a…

IDEA中的Project工程、Module模块的概念及创建导入

1、IDEA中的层级关系&#xff1a; project(工程) - module(模块) - package(包) - class(类)/接口具体的&#xff1a; 一个project中可以创建多个module一个module中可以创建多个package一个package中可以创建多个class/接口2、Project和Module的概念&#xff1a; 在 IntelliJ …

vue3模块化引用组件和引用ts,调用ts中的接口

以简单的登录功能为例子 1.在util中创建loginValidators.ts import { ref, reactive } from vueinterface User{email: string;password: string; }export const loginUserreactive<User>({email: ,password: })interface Rules{email: {required: boolean;message: …

Html提高——HTML5 新增的语义化标签

引入&#xff1a; 以前布局&#xff0c;我们基本用 div 来做。div 对于搜索引擎来说&#xff0c;是没有语义的。 但是在html5里增加了语义化标签&#xff0c;如 <header>&#xff1a;头部标签 <nav>&#xff1a;导航标签 <article>&#xff1a;内容标签 &…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

[江苏工匠杯]easyphp

先看源码 <?php highlight_file(__FILE__); $key1 0; $key2 0; ​ $a $_GET[a]; $b $_GET[b]; ​ if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("…

遗传算法及基于该算法的典型问题的求解实践

说明 遗传算法是一个很有用的工具&#xff0c;它可以帮我们解决生活和科研中的诸多问题。最近在看波束形成相关内容时了解到可以用这个算法来优化阵元激励以压低旁瓣&#xff0c;于是特地了解和学习了一下这个算法&#xff0c;觉得蛮有意思的&#xff0c;于是把这两天关于该算法…

大模型训练准备工作

一、目录 1 大模型训练需要多少算力&#xff1f; 2. 大模型训练需要多少显存&#xff1f; 3. 大模型需要多少数据量训练&#xff1f; 4. 训练时间估计 5. epoch 选择经验 6. 浮点计算性能测试 二、实现 1 大模型训练需要多少算力&#xff1f; 训练总算力&#xff08;Flops&…

分割等和子集 最后一块石头的重量II 目标和

416. 分割等和子集 力扣题目链接 本题中每一个元素的数值既是重量&#xff0c;也是价值。 dp[j]表示 背包总容量&#xff08;所能装的总重量&#xff09;是j&#xff0c;放进物品后&#xff0c;背的最大重量为dp[j] 如果背包容量为target&#xff0c; dp[target]就是装满 背…

helm部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 参考helm仓库的文档&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop helm helm repo add pfisterer-hadoop https://pfisterer.github.io/apache-hadoop-helm/ helm install hadoop pfistere…

机器学习 --- 模型评估、选择与验证

Java实训代码、答案&#xff0c;如果能够帮到您&#xff0c;希望可以点个赞&#xff01;&#xff01;&#xff01; 如果有问题可以csdn私聊或评论&#xff01;&#xff01;&#xff01;感谢您的支持 第1关&#xff1a;为什么要有训练集与测试集 1、下面正确的是&#xff1f;&…

升入理解计算机系统学习笔记

磁盘存储 磁盘是广为应用的保存大量数据的存储设备&#xff0c;存储数据的数量级可以达到几百到几千千兆字节&#xff0c;而基于RAM的存储器只能有几百或几千兆字节。不过&#xff0c;从磁盘上读信息的时间为毫秒级&#xff0c;比从DRAM读慢了10万倍&#xff0c;比从SRAM读慢了…

《剑指 Offer》专项突破版 - 面试题 79 ~ 84 : 详解回溯法(C++ 实现)

目录 一、回溯法的基础知识 二、集合的排列、组合 面试题 79 : 所有子集 面试题 80 : 包含 k 个元素的组合 面试题 81 : 允许重复选择元素的组合 面试题 82 : 包含重复元素集合的组合 面试题 83 : 没有重复元素集合的全排列 面试题 84 : 包含重复元素集合的全排列 一、…

wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器

wsl 中安装虚拟环境 virtualenv 注意&#xff1a; 不能将虚拟环境安装到 /root 目录下&#xff0c;在 window 文件管理中&#xff0c;没有权限访问 wsl 中的 /root 目录 安装虚拟环境 sudo pip install virtualenv sudo pip install virtualenvwrapper配置环境变量 1、创建…

基于单片机的指纹打卡机设计

摘要 在科学技术飞速发展的今天&#xff0c;社会对身份识别的要求越来越高&#xff0c;尤其是在企业管理的人员签到、工作考勤等活动中对身份识别的高效性和可靠性的需求更为迫切。而传统的个人身份识别手段&#xff0c;如钥匙、密码、IC卡等&#xff0c;由于具有可盗用、可伪…

深入理解TCP:序列号、确认号和自动ACK的艺术

深入理解TCP&#xff1a;序列号、确认号和自动ACK的艺术 在计算机网络的世界里&#xff0c;TCP&#xff08;传输控制协议&#xff09;扮演着至关重要的角色。它确保了数据在不可靠的网络环境中可靠地、按顺序地传输。TCP的设计充满智慧&#xff0c;其中序列号&#xff08;Seq&a…

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …

Jenkins内部使用Docker

修改docker.sock文件权限 路径在&#xff1a;/var/run/docker.sock 进入/var/run目录下 修改docker.sock文件权限&#xff0c;且让其他用户也可以读写。 cd /var/run chown root:root docker.sock chmod orw docker.sock 修改数据卷映射 切换到你Jenkins的docker-compose.…

Verdaccio部署及基础使用

1. Verdaccio 简介 Verdaccio&#xff0c;是一个轻量级的 npm 私有仓库的开源解决方案。npm是一个基于http的协议&#xff0c;用来存放软件包并且维护版本和依赖&#xff0c;利用 http 提供的 url路径 来对软件包进行增删改查。所以 Verdaccio 这款软件的核心就是实现 npm协议…