面向对象(四):[状态修饰词(static关键字、final关键字),封装]

2023-10-09 03:50

本文主要是介绍面向对象(四):[状态修饰词(static关键字、final关键字),封装],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一(状态修饰词static)

static即为静态的意思。它可以修饰类的成员变量,成员方法,代码块,但不能修饰局部变量。

静态变量:被static修饰的成员变量,该变量称为静态变量,可以被所有实例所共享。

静态方法:被static修饰的方法,该方法称为静态方法。

                 Java中的程序入口就是一个静态方法。

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

访问静态变量:类名.变量名(推荐)

package day11;class Student{static String schoolName;//声明静态变量schoolName
}public class Demo1 {public static void main(String[] args) {Student stu1=new Student();//创建第一个学生对象Student stu2=new Student();//创建第二个学生对象Student.schoolName="清华大学";//给静态变量赋值//输出两个学生对象的信息System.out.println("我是"+stu1.schoolName+"的学生");System.out.println("我是"+stu2.schoolName+"的学生");}
}

 访问静态方法:1类名.方法名(推荐)      2实例对象名.方法名

package day11;
class Person{public static void say(){System.out.println("Hello");}
}
public class Demo2 {public static void main(String[] args) {//1用"类名.方法名"的形式调用静态方法Person.say();//2用“实例化对象.方法名”调用静态方法Person p1=new Person();p1.say();}
}

由此可见,静态方法不需要创建对象就能通过类名调用。也可以通过实例化对象的方式调用静态方法。 

注意:静态方法不可以调用非静态方法

          静态方法可以调用静态方法

          静态方法不可以调用非静态变量

          静态方法可以访问静态变量

          非静态方法中有隐式的this传递,静态方法中是没有的

​
package day11;public class Demo {public static void main(String[] args) {Eoo eoo=new Eoo();eoo.test01();}
}
class Eoo{static int a=10;int b=20;public static void  staticTest01(){//静态方法中没有this的概念// System.out.println(this.b);静态方法中不可以使用this,//b  test01()  test02()非静态资源,只能通过对象来访问,//所以在静态方法中无法直接访问非静态资源}public void test01(){//非静态方法中有隐式this传递System.out.println(b);//==System.out.println(this.b);System.out.println(this.b);test02();//==this.test02();this.test02();}public void test02(){System.out.println("大胆!");}
}​

非静态资源只能通过对象来访问

总结:1.非静态方法可以直接访问静态资源和非静态资源

          2.静态方法只能直接访问静态资源

静态代码块:在Java中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。

静态代码块格式:

static{若干行代码
}

注意:当类被加载时(类何时被加载:创建本类对象或者子类对象时),静态代码块会执行,由于类只加载一次,因此静态代码块也只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。

package day11;class A{static {System.out.println("执行了Person类中的静态代码块");}
}
public class Demo3 {static {System.out.println("执行了Demo3中的静态代码块");}public static void main(String[] args) {//实例化两个A对象A a1=new A();A a2=new A();}
}

 从运行结果可以看出,程序中的两段静态代码块都执行了。Java虚拟机首先会加载类Demo3,在加载类的同时就会执行该类的静态代码块,紧接着就会调用main()方法。在main()方法中创建了两个A对象,但在两次实例化对象过程中,静态代码块中的内容只输出了一次,这就说明静态代码块在类第一次使用时才会被加载,并且只会加载一次。

static( 静态关键字): 让所有对象公用,而且不依赖对象,可以直接通过类名调用,会先被                                             加载进来        
            1.static修饰的属性和方法 优先于对象存在,不依赖对象,可以直接通过类名调用
            2.static修饰的属性和方法,只会被加载一次
            3.static修饰的属性和方法,只有一份,会被所有对象共用。
            4.static修饰的属性和方法,优先加载。
            5. static 修饰的内容在类加载(使用类)的时候,会优先加载
            6. 父类的东西要优先于子类的加载
            7. static静态的东西优先于对象存在。所以,建议调用static的东西用类名直接调用
            8. 创建对象的前提,要先加载类——> 静态的资源——>非静态资源——>调用构造器创                    建对象
使用static关键字需要注意的问题:
1. 在static 修饰的方法(静态方法)中,不能直接访问非static(非静态) 的属性或者方法; 需要访问(调用)非static(非静态)的,需要通过对象访问(调用)
2. static修饰的方法和属性,可以在静态的方法和非静态的方法中都可以直接调用

3. static修饰的方法和属性,既可以通过类名调用(推荐),也可以通过对象调用
4.静态方法中可以直接调用静态的属性和方法
5.static 修饰的属性,可以直接通过类名调用(推荐)

非静态方法(没有用static修饰的方法):
非静态的方法中可以直接调用非静态的属性或者方法
在非静态的方法中可以直接调用静态的方法和属性

static修饰的内容,会被所有的对象共享,只有一份。
static 修饰的内容,无论创建多少个对象,只会加载一次(所有对象都共用这一个)。
非static的内容,每次创建对象时,都会重新加载一次。

 静态变量:静态变量属于类,每个类中只有一份。

非静态变量:属于对象,每创建一次对象,就有一份

二(状态修饰词final)

final关键字:可用于修饰类,变量和方法,它有“不可更改”或“最终”的含义,因此被final修饰的的类,变量和方法有以下特性:

  1. final修饰的类不能被继承(也就是不能有子类)。
  2. final修饰的方法不能被子类重写。
  3. final修饰的变量:成员变量(定义的同时必须初始化)和局部变量(可以先定义再初始化),只能被赋值一次。
  4. static和final同时修饰变量时,该变量就是常量,定义的同时必须初始化。

final关键字修饰类:

Java中的类被final关键字修饰后,该类不能被继承,也就是不能够派生子类。

package day11;final class Animal{}class dog extends Animal{}
public class Demo4  {public static void main(String[] args) {Dog dog=new Dog();}
}

 由此可见,被final关键字修饰的类为最终类,不能被其他类继承。

final关键字修饰方法:

当一个类的方法被final关键字修饰后,这个类的子类将不能重写该方法。

package day11;
class Animal1{public final void shout(){System.out.println("嗷呜嗷呜!!!");}
}class Dog extends Animal1{public void shout(){System.out.println("汪汪汪");}
}
public class Demo5 {public static void main(String[] args) {Dog dog=new Dog();}
}

final关键字修饰变量:

Java中被final修饰的变量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值不能被改变 。如果再次对该变量赋值,程序会在编译时报错。

package day11;public class Demo6 {public static void main(String[] args) {final int num=10;//第一次可以赋值num=4;//再次赋值会报错}
}

注意:当局部变量使用final关键字进行修饰时,可以在声明变量的同时对变量进行赋值,也可以先声明变量然后再进行有且只有一次的赋值。而当成员变量被final修饰时,在声明变量的同时必须进行初始化赋值,否则程序编译会报错。 

package day11;public class Demo7 {
final int m;public static void main(String[] args) {final int n;n=6;}
}

 

 这是因为使用final关键字修饰成员变量时,Java虚拟机不会对其初始化,因此使用final修饰成员变量时,需要在定义变量的同时赋予一个初始值,下面将第3行的代码修改为:

final int num=10;

保存后,IDEA的编译器就不会再提示错误。

包的概念:包就是文件夹,用来管理类文件的
包的定义格式:package  包名;(多级用.隔开)

import(导包)
导包的意义:使用不同包下的类时,使用的要写全路径,写起来太麻烦了
                    为了简化带包的操作,java就提供了导包的功能
导包的格式: import 包名.类名;

三(封装)

封装是面向对象的三大特征之一,理解并掌握封装对于学习Java面向对象的内容十分重要。

为什么需要封装(封装的好处):属性私有化,提高数据安全性。

package day11;class Man{String name;int age;public void  speak(){System.out.println("我叫"+name+",今年"+age+"岁了");}
}
public class Demo8 {public static void main(String[] args) {Man man=new Man();man.name="张翼德";man.age=-18;man.speak();}
}

在该例子中,我们将age赋值为一个负数-18,这在语法上不会有任何问题,因此程序可以正常运行,但在现实生活中明显不合理的。为了避免出现这种不合理的问题,因此在设计一个Java类时,应该对成员变量的访问作出一些限定,不允许外界随意访问。这就需要实现类的封装。

封装的含义: 类的封装,是指将对象的某些信息隐藏在对象的内部,不允许外部程序直接直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部隐藏信息的操作和访问。

封装的具体实现:在定义一个类时,将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些public修饰的共有方法,其中包括用于获取属性值的getXXX( )方法和设置属性值的setXxx()方法。

给某个属性,提供一个get方法,方便再其他地方获取此属性
     get 方法 :获取属性的方法,要获取一个结果,所以要加返回值类型
      get方法的一般格式:get方法名要满足小驼峰命名法
      public 属性类型  get属性名(){ 
             return 属性;
      } 

给某个属性赋值,提供一个set方法,方便给此属性设置或者修改值
      set方法的一般格式:
      public void set属性名(属性的类型 属性名){
             this.属性名 = 属性名;
     }     

package day11;public class Demo9 {private String name;private int age;public String getName(){return name;}public void setName(String name){this.name=name;}public int getAge(){return age;}public void setAge(int age){if (age<=0){System.out.println("您输入的年龄不正确!!!");}else{this.age=age;}}public void  speak(){System.out.println("我叫"+name+",今年"+age+"岁了");}public static void main(String[] args) {Demo9 demo=new Demo9();demo.setName("张翼德");demo.setAge(-18);demo.speak();}
}

 

在main()方法中创建了Person类对象,并调用了setAge()方法传入了一个负数(-18),在setAge()方法中会对传入的age值进行检查,由于传入的-18是小于0的,所以会输出“您输入的年龄不正确!!!”。由于此时的age属性并没有被赋值,所已仍为初始值0。 

建议: 在设计类时,尽量贴合封装的原理  

封装的原理: 
            将属性私有化(加private,)目的在于在其他类中无法直接访问属性
            在本类中为这些属性添加访问的方法(行为),
            目的在于,要访问必须经过本类同意,并且由自己的行为(方法)去操作 

行为(方法):  获取属性,  可以为属性添加 get()方法
                         修改或者设置属性, 可以为属性添加 set()方法 

当类中的属性私有化之后:
                                         要获取属性值,就调用对应的get方法
                                         要修改属性值,就调用对应的set方法 

这篇关于面向对象(四):[状态修饰词(static关键字、final关键字),封装]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170138

相关文章

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装