类和对象

面向对象的思想概述

image.png

类及类的成员

image.png

对象的创建和使用

image.png

匿名对象

image.png

内存解析

image.png
image.png


属性

变量和属性其实是一回事。

image.png

成员变量和局部变量

image.png
image.png

默认初始化值

image.png

局部变量没有默认初始化值。意味着,我们在调用局部变量之前一定要显示赋值。

内存解析

  • 属性:加载到堆空间中(非static)
  • 局部变量:加载到栈空间中。

image.png

属性赋值过程

image.png


方法

image.png
image.png
image.png
image.png
image.png

重载(overload)

“两同一不同”:同一个类、方法名相同;参数(列表、个数、类型)不同。 跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!

image.png

可变形参

image.png

  1. @Test
  2. public void test5() {
  3. show("123", "456", "789");
  4. }
  5. public void show(String... strs) {
  6. for (String str : strs) {
  7. System.out.println(str);
  8. }
  9. }

方法参数的值传递机制

image.png
image.png

🌟重写(override/overwrite)

image.png

重载与重写的区别: image.png


构造器

image.png
image.png

  1. public class Animal {
  2. private int legs;
  3. // 构造器
  4. public Animal() {
  5. legs = 4;
  6. }
  7. public void setLegs(int i) {
  8. legs = i;
  9. }
  10. public int getLegs() {
  11. return legs;
  12. }
  13. }

image.png

构造器重载

image.png


代码块

image.png
image.png

static{
    System.out.println("hello,static block-2");
}
static{
    System.out.println("hello,static block-1");
    //调用静态结构
    desc = "我是一个爱学习的人";
    info();
    //不可以调用非静态结构
//        eat();
//        name = "Tom";
}

image.png

{
    System.out.println("hello, block - 2");
}
{
    System.out.println("hello, block - 1");
    //调用非静态结构
    age = 1;
    eat();
    //调用静态结构
    desc = "我是一个爱学习的人1";
    info();
}
  • 总结:由父及子,静态先行。

    对属性可以赋值的位置: ①默认初始化
    ②显式初始化/⑤在代码块中赋值
    ③构造器中初始化
    ④有了对象以后,可以通过”对象.属性”或”对象.方法”的方式,进行赋值
    执行的先后顺序:① - ② / ⑤ - ③ - ④


内部类

image.png

成员内部类

image.png

局部内部类

image.png
image.png
image.png

public class InnerClassTest {
    public static void main(String[] args) {

        //创建Dog实例(静态的成员内部类):
        Person.Dog dog = new Person.Dog();
        dog.show();
        //创建Bird实例(非静态的成员内部类):
//        Person.Bird bird = new Person.Bird();//错误的
        Person p = new Person();
        Person.Bird bird = p.new Bird();
        bird.sing();

        System.out.println();

        bird.display("黄鹂");

    }
}


class Person {

    String name = "小明";
    int age;

    public void eat() {
        System.out.println("人:吃饭");
    }


    //静态成员内部类
    static class Dog {
        String name;
        int age;

        public void show() {
            System.out.println("卡拉是条狗");
//            eat();
        }

    }

    //非静态成员内部类
    class Bird {
        String name = "杜鹃";

        public Bird() {

        }

        public void sing() {
            System.out.println("我是一只小小鸟");
            Person.this.eat();//调用外部类的非静态属性
            eat();
            System.out.println(age);
        }

        public void display(String name) {
            System.out.println(name);//方法的形参
            System.out.println(this.name);//内部类的属性
            System.out.println(Person.this.name);//外部类的属性
        }
    }


    public void method() {
        //局部内部类
        class AA {

        }
    }

    {
        //局部内部类
        class BB {

        }
    }

    public Person() {
        //局部内部类
        class CC {

        }
    }


}