✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
本篇介绍JAVA的封装,static修饰成员变量,成员方法和代码块的介绍,如有错误,请在评论区指正,让我们一起交流,共同进步!
本文开始
面向对象程序三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互使用
何为封装呢?
对类的细节进行隐藏,提供公开的接口来和数据进行交互!简单来说就是 “套壳” 屏蔽细节。
例如:买了一个电脑,里面有复杂的线路,显卡,内存,cpu等硬件,而对于我们使用计算机更关注使用,而不是里面的设计,所以为了隐藏我们给它加一个壳。
访问限定符:Java通过类和访问权限(访问修饰符)实现封装
【释】:
private: 私有的,只能在当前类中使用
default:(默认权限同一个包中的类)不写时自动默认
public: 公共的谁都可以使用
protect:主要用于继承,以后介绍
封装:使用关键字private进行封装,使封装的属性,访问权限变小,只能在当前类中才能访问!
示例:关键字private进行封装
封装就是我们根据实际的需要,使用限定访问符修饰类中的 成员变量 或 成员方法来限制它是否能使用的范围!(当前类中,当前包中等)
通过接口来实现访问封装后的变量或方法,实现值的获取,或者更改!
class People {
private String name;//封装
public int age;
private void eat() {
System.out.println("吃饭!");
}
public void show() {
System.out.println(name + " " + age);
}
public People() {
}//无参构造
public People(String name) {
this.name = name;
}//一个参数的构造
public People(String name, int age) {
this.name = name;
this.age = age;
}两个参数的构造
//接口,当调用getName时会返回当前name的值
public String getName() {
return this.name;
}
//调用setName时会赋值给当前name
public void setName() {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
People people = new People("zhang");
System.out.println(people.getName());
}
}
1.右键,点击Generate
2.点击Constructor产生指定的构造方法
点击Getter或Setter参数单独的Getter/Setter方法。
点击Gettet and Setter是它们一起生成
Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),但会有一些重复的信息,它们是不必要储存多份的,而是需要共享的!
而Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
通过学生类来看static的作用:通过static修饰的不再属于对象,属于方法区。
左边是没有加static; 右边是加上static;
classRoom:就是重复的信息,我们使用static 修饰,让所有学生类共享即可!
static修饰的成员变量,称为静态成员变量/类变量或者类成员。
静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
- 不属于某个具体的对象,是类的属性,所有>对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
静态的成员变量不属于对象,直接通过 类名来访问
静态成员方法(类方法):被static修饰的成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
1.在静态方法内部不能调用非静态成员方法
2.在静态方法内部不能直接使用非静态的数据成员
静态方法中不能使用 this
【注】:普通成员方法内部可以使用静态成员方法
如果类中有private修饰的静态成员,只通过类名(Student.size)不能够访问.
所以我们需要设置 get和set 的方法,在主函数中使用 Student.getSize()访问;
【小建议】:获取静态的成员变量或者设置静态成员变量,设置的方法最好是静态的。如果不是非静态的方法,还需要实例化对象。
1.直接初始化
2.默认初始化
引用类型:默认null
整形 / 浮点型:0 / 0.0
3.提供get和set方法初始化
4.在构造对象的时候,可以在构造方法中进行赋值
不建议这样写,因为size不是对象,在构造方法的时候不会显示size,需要自己加,不方便。
5.通过代码块赋值
普通代码块:定义在方法内部的代码块
构造块:非静态代码块/实例代码块
静态块:static
同步代码块(多线程讲解)
1.普通代码块:不常用
public static void func() {
//区分代码作用域
{
int a = 10;
System.out.println("定义在方法内部的代码块!普通代码块!");
}
}
2.实例代码块/构造代码块/非静态代码块
存在:在类内,方法外;
使用:在构造代码块之前赋值(构造代码块一般用于初始化实例成员变量)
对于 都是非静态的,看定义顺序,谁在后,最后就是那个值。
非静态代码块 和 非静态成员 都是非静态的,前后顺序不一样,name变量最后的值就不一样。
由例子可得:非静态代码块执行 》 构造代码块(无参构造或有参构造);
3.static静态代码块
使用:一般用于初始化静态成员变量
【注】
1.只有类被加载,静态代码块就会被执行
2.而构造代码块需要 new 对象(实例代码块只有在创建对象时才会执行)
3.静态代码块不管生成多少个对象,其只会执行一次
4.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
5.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
执行顺序:静态代码块 》 非静态代码块 》 构造代码块
✨✨✨各位读友,本篇分享到内容,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!