• 封装以及static修饰符的应用


    在这里插入图片描述

    封装

    让类中尽可能多的属性和方法隐藏起来,不让外部直接访问,而是通过 类中提供的公共方法间接来访问你隐藏的内容
    我们可以在这个提供的公共方法中设置一些验证数据的操作,从而保证数据的合理性和正确性

    封装概述

    (1)Java中封装的实质就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
    (2)封装反映了事物的相对独立性,有效避免了外部错误对此对象的影响,并且能够对对象使用者由于大意产生的错误起到预防作用。
    (3)面向对象编程提倡对象之间实现松耦合关系。
    (4)封装的好处在于隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据,可以方便地加入存取控制修饰符,来限制不合理操作。
    (5)松耦合就是指尽量减少对象之间的关联性,以降低它们之间的复杂性和依赖性。

    封装的步骤

    1. 修改属性的可见性
      将类中的属性由public修改为private即可。

    2. 设置setter/getter()方法
      可以手动添加setter/getter()方法,也可以使用组合键Ctrl+Shift+S由系统添加。

    3. 设置属性的存取限制
      在setter()方法中进一步利用条件判断语句进行赋值限制。
      在这里插入图片描述
      在这里插入图片描述

    封装的好处

    • 便于使用者正确使用系统,防止错误修改属性
    • 有助于系统之间的松耦合,提高系统独立性
    • 提高软件的可重用性
    • 降低了构建大型系统的风险

    练习一:使用封装实现企鹅类
    需求说明
    使用封装实现电子宠物系统的企鹅类正确输入健康值和
    亲密度
    ●保证健康值的有效性(O-100),否则取默认值60·保证亲密度的有效性(O-100),否则取默认值60
    在这里插入图片描述

    package cn.bdqn.demo02;
    
    public class Penguin {
    
    	private String name;
    	private int health;
    	private int love;
    
    	public Penguin() {
    	}
    
    	public Penguin(String name, int health, int love) {
    		this.setName(name);
    		this.health = health;
    		this.love = love;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	//定义获取健康值的方法
    	public int getHealth(){
    		return health;
    	}
    	//定义设置健康值的方法
    	public void setHealth(int health){
    		//对你调用此方法传递过来的数据进行判断
    		if(health<0||health>100){
    			System.out.println("你输入的健康值不合理,默认给你的企鹅健康值赋值为60");
    			this.health=60;
    		}else{
    			this.health=health;
    		}
    	}
    
    	public int getLove() {
    		return love;
    	}
    
    	public void setLove(int love) {
    		this.love = love;
    	}
    	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    package cn.bdqn.demo02;
    
    public class PenguinTest {
    
    	public static void main(String[] args) {
    		// 创建Penguin类对象
    		Penguin penguin = new Penguin();
    		penguin.setName("QQ");
    		System.out.println(penguin.getName());
    
    		// penguin.health = 90;
    		penguin.setHealth(-90);
    		int health =penguin.getHealth();
    		System.out.println("企鹅健康值:"+health);
    		
    		penguin.setLove(90);
    		System.out.println(penguin.getLove());
    		
    		double num =Math.random();
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 一个Java文件中只能有一个public修饰的类,并且这个类的名称要和这个Java文件的名称保持一致
    • 一个Java文件中除了public修饰的类之外,还可以定义0个或者多个默认修饰符(什么都不写)的类

    注意一般来说,一个Java文件中只定义一个类

    为什么需要包

    Windows树形文件系统
    文档分门别类,易于查找和管理使用目录解决文件同名冲突问题
    在这里插入图片描述

    如何存放两个同名的类而不冲突

    在这里插入图片描述
    在这里插入图片描述

    如何创建包

    package cn.jbit.inherit;     //声明包
    public class School{
    }
    
    • 1
    • 2
    • 3

    作为Java源代码第一条语句
    用package声明包,以分号结尾

    命名规范

    包名由小写字母组成,不能以圆点开头或结尾
    package mypackage;
    包名之前最好加上唯—的前缀,通常使用组织倒置的网络域名
    package net.javagroup.mypackage;
    包名后续部分依不同机构内部的规范不同而不同
    package net.javagroup.research.powerproject;

    用MyEclip.se创建包

    JDK提供基本包

    • a.lang:虚拟机自动引入
    • java.util:提供一些实用类
    • java.io:输入、输出

    使用MyEclise创建包的两种方法

    • 分别创建包和类
    • 创建类的过程中创建类所在的包

    为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类

    import包名.类名;

    import java.util.*;/导入java.util包中所有类
    import cn.jtest.classandobject.School;//导入指定包中指定类
    
    • 1
    • 2
    • 系统包:java.util
    • 自定义包:cn.jtest.classandobject
    • *:指包中的所有类
    • School :指包中的School类

    使用包的注意事项

    1. 一个类同时引用了两个来自不同包的同名类
      必须通过完整类名来区分

    2. 每个包都是独立的,顶层包不会包含子包的类

    3. package和import的顺序是固定的
      package必须位于第一行(忽略注释行)
      只允许有一个package语句
      其次是import
      接着是类的声明

    类的访问修饰符

    • public修饰符:公有访问级别
    • 默认修饰符:包级私有访问级别
      在这里插入图片描述

    static修饰符

    static可以用来修饰
    成员变量
    静态变量,可以直接通过类名访问
    成员方法
    静态方法,可以直接通过类名访问
    代码块
    静态代码块,当Java虚拟机加载类时,就会执行该代码块

    JVM加载类时,加载静态代码块

    • 如果有多个静态块,按顺序加载
    • 每个静态代码块只会被执行一次

    static变量

    类的成员变量包括

    1. 类变量(静态变量)
      被static修饰的变量
      在内存中只有一个拷贝
      类内部,可在任何方法内直接访问静态变量
      其他类中,可以直接通过类名访问

    2. 实例变量
      没有被static修饰的变量
      每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响

    static方法

    静态方法:可直接通过类名访问
    静态方法中不能使用this和super
    不能直接访问所属类的实例变量和实例方法
    可直接访问类的静态变量和静态方法

    实例方法:通过实例访问
    可直接访问所属类的静态变量、静态方法、实例变量和实例方法
    静态方法必须被实现
    main()就是最常用的静态方法

    练习02:选民投票
    需求说明:
    模拟实现选民投票过程:一群选民进行投票,每个选民只允许投一次票,并且当投票总数达到100时,就停止投票

    package cn.bdqn.demo09;
    
    public class Voter {
    	
    	//定义一个静态变量用来表示选民投递的是第多少票,这个变量值可以被多个Voter对象共用
    	static int count= 0;
    	//定义一个静态常量值来表示投票的总数
    	final static int NUM = 100;
    	
    	private String name;
    
    	public Voter() {
    	}
    
    	public Voter(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	//定义一个方法来表示投票过程
    	public void touPiao(){
    		//判断投票数目有没有满100票,满了就不能再投票
    		if(count<100){
    			count++;
    			System.out.println(this.getName()+"投了第"+count+"票");
    		}else{
    			System.out.println("投票已满,不能再投票");
    		}
    		
    	}
    	
    	//定义一个方法查看当前投票的数目
    	public static void show(){
    		System.out.println("已经投递了"+count+"票");
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    package cn.bdqn.demo09;
    
    public class Test {
    
    	public static void main(String[] args) {
    		
    		//投票前查看一下投了多少票
    		Voter.show();
    		
    		//创建一个叫张三的选民,然后进行投票
    		Voter v1 = new Voter("张三");
    		v1.touPiao();
    		
    		Voter v2 = new Voter("李四");
    		v2.touPiao();
    		
    		for(int i =1;i<=97;i++){
    			Voter v = new Voter("v"+(2+i));
    			v.touPiao();
    		}
    		
    		Voter v100 = new Voter("lisa");
    		v100.touPiao();
    		
    		Voter v101 = new Voter("lisasa");
    		v101.touPiao();
    		
    		Voter.show();
    
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    结束

    在这里插入图片描述

  • 相关阅读:
    「C++小游戏教程」计时器
    3.无重复字符的最长子串
    nginx反向代理与负载均衡
    大模型应用:Prompt-Engineering优化原则
    第01章+Java概述
    《迷失岛2》游戏开发框架开发日记:场景切换和淡入淡出效果
    SPA项目开发之动态树+数据表格+分页
    合并两个有序数组
    @Async注解的坑,小心
    学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
  • 原文地址:https://blog.csdn.net/qq_45734913/article/details/126859770