个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌
目录
- 一、封装
- 1.1什么是封装
- 1.2访问修饰符
- 二、封装拓展之包
- 2.1包的概念
- 2.2导入包中的类
- 2.3自定义包
- 三、static成员
- 3.1static修饰成员变量
- 3.2静态成员方法的访问
- 3.3static成员变量的初始化
- 四、代码块
一、封装
1.1什么是封装
封装概念:将数据和对数据的操作封装在一个类中,对外部的访问只通过类提供的接口进行。
封装目的:隐藏类的内部实现细节,只公开必要的方法来操作数据,避免数据被外部直接访问和修改,从而提高代码的安全性和可维护性。
那java是如何控制对数据的访问权限呢,答案是访问修饰符。通过访问修饰符,可以控制对数据的访问权限,以确保代码的安全性和封装性。
1.2访问修饰符
java中主要有以下四种访问修饰符:
加粗样式
- public:公共访问修饰符,可以被任何其他类或代码访问。
- protected:受保护的访问修饰符,可以被同一包内的类、子类以及其他包中的子类访问。
- default(默认):没有显式指定访问修饰符时,默认的访问修饰符,可以被同一包中的类访问。
- private:私有访问修饰符,只能被所属类的内部访问。
二、封装拓展之包
2.1包的概念
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
2.2导入包中的类
在Java中,你可以使用import关键字来导入其他包中的类。导入包中的类可以让你在当前文件中直接使用这些类而无需使用完整的包名来引用它们。
比如,我们想要导入java.util包中的Date类。即import java.util.Date
。
public class Test3 {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
这里如果需要使用 java.util
中的其他类,,可以使用 import java.util.*
需要注意的是:import java.util.*
中的*
代表导入‘java.util’包下的所有类,从而使所有类都可以在代码中直接使用。同时这里并不是一次性把java.util包下的所有类都导入进来,而是用到哪个类才导入哪个类(即用到谁导入谁)。
并不是只有 java.util包
才有Date类,java.sql包
中也是有Date类的。
2.3自定义包
在Java中,我们可以创建自己的包来组织和管理你的类文件。
创建和使用自定义包的一般步骤如下:
1.创建包目录结构:在我们的项目或源代码目录下,创建一个与我们的包名相对应的目录结构。例如,如果我们的包名是com.example.mypackage
,那么你应该创建一个目录结构为com/example/mypackage
的文件夹。
2.编写类文件:在包目录结构下,创建你的类文件。例如,在com/example/mypackage目录下,你可以创建一个名为MyClass.java的文件,并在其中定义你的类。
3.声明包名:在你的类文件的开头,使用package关键字来声明你的包名。例如,在MyClass.java
中,你可以添加如下的包声明:package com.example.mypackage;
4.导入和使用包中的类:如果你在另一个Java文件中想要使用你的包中的类,可以使用import语句导入该类。例如,如果你想在Main.java
中使用MyClass
类:
import com.example.mypackage.MyClass;
public class Main {
public static void main(String[] args) {
MyClass myObject = new MyClass();
// 使用myObject进行操作
}
}
三、static成员
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。
举个例子,我们以学生类进行举例,现在有10个学生,这10个学生中都是在同一个班级,所以我们此时就不需要再学生类中写一个成员变量来保存学生所处的班级,我们可以把班级理解为这些学生的共同属性,即所有学生所共享的一个属性。所以我们当然不需要在每个学生类对象中都要存储一份这样的属性,因为这个班级属性是每个学生所共享的。
3.1static修饰成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
静态成员变量的特性如下:
- 静态成员变量不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 静态成员变量的生命周期随类的加载而创建,随类的卸载而销毁
如果要为成员变量进行赋值的话,我们如下图可以直接为静态成员变量进行赋值即可。
3.2静态成员方法的访问
静态成员方法的访问是通过类名来进行访问的。
下面是静态成员方法的特性:
- 静态成员方法不属于某个具体的对象,是类方法
- 静态成员方法通过类名去进行访问,当然如果通过对象去访问也是可以的,只不过更推荐通过类名去进行访问
- 不能直接访问静态方法中的任何非静态成员变量和非静态成员方法
综上,静态的无论是静态成员变量还是静态成员函数都是不依赖于对象的,它们都是可以通过类名去进行访问的。
3.3static成员变量的初始化
静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化和静态代码块初始化。
就地初始化:在定义时直接给出初始值。
请看举例:
代码块初始化:
四、代码块
使用 {}
定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
实例代码块、静态代码块、局部代码块、同步代码块。
下面来看下述代码:
public class MyStudent {
public String name;
public int age;
public int ID;
public static String classes = "classone";
{
System.out.println("实例代码块");
}
static {
System.out.println("静态代码块");
}
public MyStudent(){
this("李华",18,123456);
System.out.println("不带参数的构造函数");
}
public MyStudent(String name,int age,int ID){
System.out.println("带参数的构造函数");
this.name = "Daming";
this.age = 21;
this.ID = 123456;
}
public static void main(String[] args) {
MyStudent s1 = new MyStudent();
}
}
看下图代码的执行结果:
由此可以看出static修饰的成员变量在对象创建之前就已经创建完成了,所以static修饰的成员变量和成员方法加载的速度比较快。
实例代码块、静态代码块、局部代码块、同步代码块的执行顺序如下:
1.静态代码块:静态代码块首先在类加载时执行,只会执行一次,并在类加载后执行。它用于初始化类的静态成员变量或执行其他静态初始化操作。
2.实例代码块:实例代码块在每次创建对象时都会被执行。它在构造方法之前执行,并且不管调用哪个构造方法,都会执行实例初始化块。
3.构造方法(Constructor):构造方法用于创建对象并对实例变量进行初始化。构造方法的执行顺序由具体调用的构造方法决定。
4.局部代码块:局部代码块是在方法或条件语句内部定义的代码块。它在程序运行到该代码块时被执行。
5.同步代码块(Synchronized Block):同步代码块使用关键字包裹一段代码,用于实现线程同步。当线程进入同步代码块时,需要获取锁,其它线程需要等待锁释放才能执行。
注意事项如下:
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
4.实例代码块只有在创建对象时才会执行
总之:静态代码块只在类加载时执行一次,而实例代码块(在构造方法之前执行
)在每次创建对象时都会执行。局部代码块和同步代码块在程序运行到相应的位置时才会执行。构造方法在创建对象时被调用,并且可以根据具体的构造方法决定执行顺序。
以上就是本文的全部内容。
好了,友友们,本文到这里就结束了,再见啦!!!