
欢迎来到我的博客!❥(^_-) 我是VON,一个热爱JAVA的人。在这个博客上,我希望与大家分享关于java相关的一切。我相信知识的分享能够让我们共同进步,因此我会尽力提供有价值、有趣和实用的内容。 关于我(≧∇≦)ノ 我就读于大一,在编程语言方面有着丰富的学习经验。这些天来,我积累了不少关于java的见解和经验,希望能够通过博客分享给大家,也希望能够从读者那里学到更多。 博客内容(〃'▽'〃) 在这个博客中,你可以期待看到关于权限修饰符和代码块的深入分析、实用的技巧以及我的个人见解。无论你是一个新手小白还是高端大佬,这里都会有适合你的内容。 我的目标(*^▽^*) 通过这个博客,我希望能够建立一个有意义的社区,与热爱java的人们分享想法和经验。我鼓励读者们积极参与讨论,提出问题,或者分享你自己的见解和经验。我们可以共同学习,共同进步! 最后ヾ(◍°∇°◍)ノ゙ 感谢你访问我的博客,希望你能够喜欢这里的内容。如果你有任何问题、建议或者想要与我交流,都可以通过博客与我取得联系。期待与你在博客中见面! 我的博客:VON

Java 中的权限修饰符用于控制类、变量、方法及构造方法的访问权限。
public class text {
public static void main(String[] args) {
A a=new A();
System.out.println(a.name);
}
}
class A{
private String name;
public void show(){
System.out.println("show");
}
}
package com.von.day13;
public class text {
public static void main(String[] args) {
A a=new A();
System.out.println(a.name);
}
}
class A{
String name;
public void show(){
System.out.println("show");
}
}package com.von.day13a;
import com.von.day13.*;
public class text {
public static void main(String[] args) {
A a = new A();
System.out.println(a.num);
}
}
不同包下的无关类无法使用
package com.von.day13a;
import com.von.day13.A;
public class text{
public static void main(String[] args) {
A a = new A();
System.out.println(a.name);
}
}
package com.von.day13;
public class A{
public String name;
public void show(){
System.out.println(name);
}
}package com.von.day13a;
import com.von.day13.A;
public class text{
public static void main(String[] args) {
A a = new A();
System.out.println(a.name);
}
}
在Java中,代码块是用来组织和执行一组语句的区域,代码块的使用可以帮助组织和控制程序的执行流程,尤其是在对象初始化、线程同步和变量作用域的管理方面非常有用。
{} 包围,主要用于限定变量的作用域。package com.von.day13;
public class text {
public static void main(String[] args) {
{
int num = 0;
System.out.println(num);
}
System.out.println(num);
}
}思考一下,为何无法解析符号呢?

因为变量num在{}结束后就从内存中消失了。
静态代码块(Static Block)是 Java 类中的一个特殊的代码块,用于类的初始化。它在类被加载时执行,且只执行一次。静态代码块与普通的构造代码块有所不同,它使用关键字 static 来声明,并且没有参数。
new 关键字创建对象、通过类名访问静态变量等情况)。
静态代码块通常用于以下情况:
package com.von.day13;
public class Student {
private String name;
private int age;
//静态代码块
static {
System.out.println("Hello World");
}
public Student() {
System.out.println("Hello");
}
public Student(String name, int age) {
System.out.println("World");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}package com.von.day13;
public class text {
public static void main(String[] args) {
Student s = new Student();
Student s1 = new Student("张三", 18);
}
}
构造代码块(Constructor Block)是 Java 类中的一种特殊的代码块,它用来初始化实例对象。构造代码块在创建对象时被调用,每次创建对象时都会执行。它的特点是没有方法名,用花括号 {} 包围,只能在类中定义,不能单独存在或被调用。
构造代码块通常用于以下情况:
package com.von.day13;
public class Student {
private String name;
private int age;
//构造代码块
{
System.out.println("Hello World");
}
public Student() {
System.out.println("Hello World");
}
public Student(String name, int age) {
System.out.println("Hello World");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


在Java中,同步代码块是一种用于多线程编程的机制,用来确保多个线程不会同时访问共享资源而导致数据不一致或不可预料的结果。Java通过关键字 synchronized 实现同步代码块的定义,它可以应用于方法或代码块。
同步代码块的一般语法结构如下:
synchronized (expression) {
// 需要同步的代码块
}expression 表示一个对象表达式,通常是一个引用类型的变量或者常量,用作同步锁。考虑一个简单的银行账户的例子,多个线程同时操作同一个账户的余额。为了确保操作的安全性,我们可以使用同步代码块来保护这个共享资源。
public class BankAccount {
private int balance;
public BankAccount(int initialBalance) {
this.balance = initialBalance;
}
// 存款方法
public void deposit(int amount) {
synchronized (this) { // 使用当前对象作为锁
balance += amount;
System.out.println("Deposited " + amount + ", new balance is " + balance);
}
}
// 取款方法
public void withdraw(int amount) {
synchronized (this) {
if (balance >= amount) {
balance -= amount;
System.out.println("Withdrawn " + amount + ", new balance is " + balance);
} else {
System.out.println("Insufficient funds for withdrawal");
}
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
// 创建两个线程进行存款和取款操作
Thread depositThread = new Thread(() -> {
account.deposit(500);
});
Thread withdrawThread = new Thread(() -> {
account.withdraw(200);
});
depositThread.start();
withdrawThread.start();
}
}在上面的示例中:
deposit 和 withdraw 方法使用 synchronized (this) 来确保对 balance 字段的操作是线程安全的。deposit 方法时,它会获取到 BankAccount 对象的锁,执行存款操作后释放锁,这时另一个线程可以获取该锁执行取款操作,保证了账户操作的正确性和一致性。
this,因为使用 this 可能导致意外的竞争条件。例如,可以创建一个私有的 Object 类型的字段来作为锁对象。