初始面向对象


初始面向对象

创建对象的时候:new Code02();就会调用构造函数创建完对象了。

static修饰的变量叫做类变量,也叫静态变量.类变量是整个类和对象所共有的。
实例变量是相互隔离的。
static修饰的方法叫做类方法,也叫静态方法 static{}叫做静态块,最先被加载(优先加载)不能显示调用,且只能加载一次
public class Code01 {
    static {//静态块
        System.out.println("这是静态块");
    }

    Code01(){
        System.out.println("这是构造方法");
    }
    public static void main(String[] args) {
        Code01 code01 = new Code01();   //Java里面只要new了,就肯定在堆内存上开辟了新的空间
        Code01 code02 = new Code01();
        Code01 code03 = new Code01();
        //这是静态块
        //这是构造方法
        //这是构造方法
        //这是构造方法
    }
}
构造函数的作用就是完成类中变量的初始化
Java构造函数的名字和类名必须一致,没有返回值的修饰,有没有修饰符都可以

如果一个类中没有显示的提供构造函数,Java编译器会隐式的提供一个默认无参的构造函数
如果一个类中没有显示的提供构造函数,那么Java构建对象时必须依赖类中提供的构造函数
public class Code02 {

    public Code02() {
        System.out.println("构造函数");
        return; //可以有返回但不能加具体的值,否则爆红
//        System.out.println("构造函数以");  return之后不能有其他的语句否则爆红
    }

    public static void main(String[] args) {
        new Code02();
        //构造函数
    }
}

创建对象之前会调用匿名构造块

静态块:只会调用一次

匿名构造块:创建对象一次执行一次,在执行构造函数之前执行。

public class Code03 {
    static {
        System.out.println("静态块");
    }

    {
        System.out.println("匿名构造函数");
    }

    Code03() {
        System.out.println("默认无参构造函数");
    }

    Code03(String name) {
        System.out.println("有参构造函数,参数为:"+name);
    }

    public static void main(String[] args) {
        new Code03();
        /*
        静态块
        匿名构造函数
        默认无参构造函数
         */
        new Code03("MoonStone97");
        /*
        匿名构造函数
        有参构造函数,参数为:MoonStone97
         */
    }

}

简单描述一下栈内存和堆内存

String s1=new String();


栈内存:是存放Java声明的基本数据类型(4种8个)和声明的引用类型String s1;效率高,程序运行结束,栈内存就释放。

堆内存:存放Java new出来的对象,new String();效率低,因为new这个对象是在程序运行期间才去创建,执行后,new这个内存。而是Java虚拟机去自动回收Java中只要new了,就肯定在堆内存上开辟了新的内存空间。

static变量是存放在静态全局数据区,是所有对象和类共同指向的内存区域。

this的使用,this就是代指本次创建的对象、引用类型的赋值

public class Code01 {
    String name;    //姓名:实例变量
    static int count;   //访问次数:类变量
    public Code01(String name){
        this.name=name;
    }

    public static void main(String[] args) {
        Code01 code01 = new Code01("对象一");
        Code01 code02 = new Code01("对象二");
        code01.name="100";
        System.out.println("code02.name的值:"+code02.name);   //code02.name的值:对象二
        
        
        Code01 code03=code01;   //引用类型的赋值,改变了对象的指向;实际就是把code01对象的地址赋给code03
        System.out.println("code03.name的值:"+code03.name);   //code03.name的值:100
         Code01.count=15;
        System.out.println(code01.count+"  "+code02.count);   //15  15

    }
}

静态块、匿名构造函数、构造函数的执行顺序(包括全局变量与局部变量的修改)

public class Code02 {
    int age;
    static String address;

    static {//静态块的访问规则和静态方法相同,不能直接使用实例变量
        //age=10;   爆红

        //在静态块中要使用实例变量,需要通过对象进行调用
        Code02 code02 = new Code02(25);
        System.out.println("静态块:"+address+" , "+code02.age);   //静态方法可以直接使用类变量
    }

    {
        age=50;
        address="南京";
        System.out.println("匿名块:"+address+" , "+age);
    }

    public Code02(int age) {
        this.age = 20;
    }

    public static void main(String[] args) {
        new Code02(15);
        /*
        匿名块:南京 , 50
        静态块:南京 , 20
        匿名块:南京 , 50
         */
    }
}

局部变量与全局变量一

public class Code03 {
    int num=5;

    public Code03() {//局部变量
        int num = 100;
    }

    public Code03(int num) {
        this.num = num;
    }

    public static void main(String[] args) {
        Code03 code03 = new Code03();
        System.out.println(code03.num); //5

        Code03 code04 = new Code03(110);
        System.out.println(code04.num); //110
    }
}

局部变量与全局变量二

public class Code04 {
    int age=10;

    static {
        //this关键字不能用在static修饰的块和方法中
        //this.age=24;    爆红
    }

    public static void check(){
        //this关键字不能用在static修饰的块和方法中
        //this.age=100;    爆红
    }

    public void display(){
        this.age=100;   //this关键字可以在构造函数和实例方法中使用,代表当前对象
    }
}

this关键字的使用

public class Test {
    int age;

    public Test(){
        //this 代表当前对象this(参数),代表访问类中和这个参数类型一致的构造函数===》public Test(int age){age=100;}
        this(20);
    }

    public Test(int age){
        age=100;
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.age);   //0
    }
}