一、匿名对象
1、没有对象名称的对象
2、使用场景:
 A.只调用一次方法时
 B.作为方法的参数或作为方法的返回值时使用,直接传入传出一个对象
3、注意点:
 A.栈方法区中没有引用地址,只在堆内存中开辟内存空间,也是优先被回收的(垃圾回收器gc),节省内存空间
 B.匿名对象可以给成员变量赋值,但是没有任何意义,因为没对象名拿不到值
4、语法:
 A.new 类名();
package qf22020217;
/**
 * 匿名对象
 */
public class Demo01 {
    public static void main(String[] args) {
        //调用一次方法时
        System.out.println(new Person2().getAge());
        //传入方法中
        new GetPerson().getPerson2(new Person2());
    }
}
class Person2{
    public int age;
    public String name;
    public int getAge(){
        return age;
    }
    public String getName(){
        return name;
    }
}
class GetPerson{
    public void getPerson2(Person2 temp){
        System.out.println(temp.getName());
    }
}
 
二、成员变量与局部变量的区别
1、定义的位置不同
A.成员变量在方法外(类中),局部变量是在方法中
2、声明周期不同
 A.成员变量是随着对象的加载而加载,随着对象的销毁而销毁
 B.局部变量是随着方法的加载而加载,随着方法的结束而结束
3、存储的位置不同
 A.成员变量是存在堆内存中,局部变量是存在栈内存中
4、是否有默认值
 A.成员变量有默认值,可以直接使用
 B.局部变量是没有默认值,必须先赋值,才能使用
三、封装:对属性进行封装、对工具类进行封装
1、属性封装代码
package qf22020217;
public class Demo02 {
    public static void main(String[] args) {
        Animal02 animal02 = new Animal02();
        //外部不能直接对对象属性取值赋值
        animal02.setAge(-21);
        System.out.println(animal02.getAge());  //结果为0,没有赋值成功
    }
}
class Animal02 {
    private int age;
    public void setAge(int age) {
        if (age > 0) {     //提高了数据的安全性,设置条件进行筛选
            this.age = age;
        }
    }
    
    public int getAge() {
        return age;
    }
}
 
2、问题
 A.private进行修饰,从外部不能直接访问其属性,通过get、set方法
 B.在方法中,因为局部变量优先于成员变量,所以进行赋值时,this.age = age ==> this.成员变量 = 局部变量
四、构造方法
1、名称:构造方法、构造函数、构造器
2、作用:
 A.构造方法是来实例化对象的
 B.构造方法在实例化对象的时候给成员变量进行赋值
 C.所有实例化对象都会执行构造方法
3、分类
 无参构造、有参构造
4、特点:
 A.构造方法的构造名称就是类名
 B.构造方法是没有返回值,可以是使用return,用来结束构造方法
 C.构造方法不能自身调用,必须由jvm来进行调用
5、说明:
 A.系统会默认提供一个无参构造函数,如果自己重载了一个有参构造函数,系统就会不默认提供
 B.在实际开发中,一般会存在一个无参构造函数和一个有参构造函数
6、set方法与构造方法
 相同点:都可以给成员变量进行赋值
 不同点:构造函数只能在实例化对象的时候给成员变量赋值一次
 set方法是可以给成员变量进行多次赋值
五、静态
1、静态的概念
 A.关键字:static 静止
 B.修饰的成员变量:类 方法 变量…
2、区别
 没有静态:在多个对象具有相同属性时,内存资源浪费,且修改相同资源时麻烦
 有静态修饰符:在方法区中开辟一块空间,实现所有对象共享,只需要一次修改。
3、静态变量的访问的方式:类名或者对象名.
4、注意:静态变量又称为类变量,随着类的加载而加载,静态资源时最不容被gc(垃圾回收器)回收的,建议少用.
下面分别用代码和图解表述静态变量特点和存储
package qf22020217;
public class Demo03 {
    public static void main(String[] args) {
        //第一个对象创建
        Person p1 = new Person();
        p1.name = "小明";
        Person.country = "中国";  //只需赋值一次,对象共享
        p1.print();
        //第二个对象创建
        Person p2 = new Person();
        p2.name = "小李";
        p2.print();
    }
}
class Person{
    static String country;
    String name;
    public void print(){
        System.out.println("国家:"+Person.country+"\t"+"姓名:"+this.name);
    }
}
 

5、上述代码内存图解(静态变量可以类名(推荐)或对象名取值,我这里只标类名取值)
 
6、静态方法访问问题:
 由于静态变量随着类加载而加载的,比对象先存在。所以静态变量方法不能访问非静态的方法,也不能访问this关键字,在静态方法中也不能访问静态的变量
六、静态变量与成员变量的比较
1、所属不同
 静态变量又称为类变量,成员变量又称为对象变量
 2、存储的位置不同
 静态变量存在 方法区中静态区间,成员变量是存在堆内存中
 3、生命周期不同
 静态变量:随着类的加载而加载,最难被回收
 成员变量:随着对象的创建而加载,随着对象销毁而销毁
 4、访问方式不同
 静态变量:直接使用类名来进行访问,也可以对象名来进行访问
 成员变量:只能使用对象名来进行访问
七、继承
1、继承的概念
 A.子类可以获取到父类的资源,父类不能获取到子类的资源
 B.子类也有不能获取父类的资源:
 不能调用private修饰的属性的,因为private只能在本类中使用
 不能继承父类中的构造方法,因为构造方法只能是自己的类名才可以,但可以调用
 C. super==>表示当前对象父类对象的引用,调用的语法: super() 调用无参的构造 super(参数列表) 调用父类的有参构造
2、在继承中访问成员变量的特点:
 A.如果子类变量名与父类的变量重名的时候 优先访问子类的变量
 B.如果子类变量与父类的变量名不重名的时候 优先访问子类的变量 如果没有 则向上进行查找 一直查找到Object
3、Object是任何类的父类或者间接父类
4、 this和super的区别
 A.构造方法:
 this()只能访问自身的构造方法 super() 只能访问父类的构造方法
 B.成员变量:
 this.变量名 既可以访问的自身成员变量 也可以访问到父类的成员变量
 super.变量名 只能访问到父类的成员变量
 C.成员方法:
 this.方法名() 既可以访问的自身成员方法 也可以访问到父类的成员方法
 super.方法名() 只能访问到父类的成员方法
解释:
 因为子类继承了父类的属性、方法,所以代表子类的对象的this即可以访问自己也可以访问父类
 但构造方法由jvm调用,也不能被继承,所以只能访问各自的
 因为super代表父类的引用,但父类又不能访问子类的资源,所以super只能访问父类的属性、方法










