断更了这么久,自己定下的目标也没有完成,我哭辽。马上就秋招了,这半年抓紧时间,好好过一遍。
接着之前的我们继续说类和对象。
private关键字
private关键字可以修饰成员变量,也可以修饰类的方法。
1.private修饰成员变量。
当一个成员变量被private关键字修饰时,那么该成员变量就无法被该类之外的其他类访问,但是我们可以对外提供set()和get()方法来访问该变量。
public class Main{
private int x;//private修饰成员变量
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
get()和set()方法需要用public来修饰,不然其他类是无法访问得到x的信息。
this关键字
我们在写Java代码中经常会写到这样的代码,例如上面的set()方法
public void setX(int x) {
this.x = x;
}
但是我却搞不懂this到底指的是什么,this可以这样用,但是this是个啥?
在经过查资料学习之后,我才明白this就是当前对象的引用
如果一个类的方法有和这个类的属性同名的变量时,在这个方法里面,调用类的成员变量就需要使用this。
//不使用this关键字,直接对类的x进行赋值
public class Demo {
private int x = 0;
public static void main(String[] args){
Demo test = new Demo();
test.test();
System.out.println(test.x);
}
public void test() {
int x = 5;
x = x;
}
}
结果:
可以看到Demo的属性x的值并没有任何变化,但是当我们使用this之后
public class Demo {
private int x = 0;
public static void main(String[] args){
Demo test = new Demo();
test.test();
System.out.println(test.x);
}
public void test() {
int x = 5;
this.x = x;
}
}
结果:
代码块
代码块有分为好几种,如普通代码块,静态代码块,构造代码块。
1.静态代码块
public class Demo {
private static int x;
static {
x = 100;
}
}
- 静态代码块中只能写静态变量,不能写普通变量,普通变量只能通过对象来调用
- 静态代码块必须使用static关键字修饰
//不用static修饰静态代码块
public class Demo {
private static int x;
{
x = 100;
}
public static void main(String[] args){
System.out.println(Demo.x);
}
}
结果:
- 静态代码块不能存放在任何方法体中静态代码块在类加载的时候就运行了。
对于普通方法,由于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。
对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。
我们需要明确静态代码块的存在在类加载的时候就自动运行了,而放在不管是普通方法还是静态方法中,都是不能自动运行的。 - 静态代码块在类加载的时候就运行了,并且优先于各种代码块和构造函数 ,如果有多个静态代码块,那么会按书写顺序依次执行。
- 静态代码块在整个程序运行过程中,只执行一次。
2.构造代码块
构造代码块的书写格式和静态代码块的书写格式特别像,但是没有static关键字修饰
public class Demo {
{
System.out.println("构造代码块");
}
}
- 构造代码块在每次创建对象时被调用,并且优于构造函数先执行,但是如果不实例化对象,构造代码块就不会 执行。
public class Demo {
{
System.out.println("构造代码块");
}
public Demo (){
System.out.println("我是构造函数");
}
public static void main(String[] args){
new Demo();
}
}
- 构造代码块和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。
3.普通代码块
普通代码块和构造代码块书写方式相同,不同的是构造代码块定义在类中,普通代码块定义在方法体中
public void test(){
{
System.out.println("我是普通代码块");
}
}
4.构造函数
- 构造函数的命名必须和类名相同
- 构造函数在new一个实例化对象的时候被调用,初始化一些参数。
- 定义一个类的时候,我们不一定会写构造函数,但是Java编译器会提供一个默认的无参构造函数
- 自定义构造函数的时候可以对构造函数进行重载,根据创建的实例化对象所传的参数选择执行那个构造函数
标题静态代码块、构造代码块、普通代码块、构造函数在类加载时的执行顺序
- 静态代码块>构造代码块>构造函数>普通代码块
public class Demo {
static {
System.out.println("我是静态代码块");
}
{
System.out.println("我是构造代码块");
}
public Demo(){
System.out.println("我是构造函数");
}
public void test(){
{
System.out.println("我是普通代码块");
}
}
public static void main(String[] args){
System.out.println("我是main方法");
new Demo().test();
System.out.println("===================");
new Demo().test();
}
}
这里我们可以看到静态代码块在main()函数之前执行,且在整个运行过程只运行一次