一、成员变量和局部变量
1、区别
1)在类中的位置不同
- 成员变量:在类中方法外
- 局部变量:在方法定义中或者方法声明上
2)在内存中的位置不同
- 成员变量:在堆内存
- 局部变量:在栈内存,随着方法在【栈】中运行
3)生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失(new)
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4)初始化值不同
- 成员变量:有默认初始化值
- 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
2、注意事项:
- 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
- 就近原则与 this 关键字联合使用,可以明确的定位确定 局部变量、成员变量、内部类中的变量等。
二、形式参数的问题:(Java值传递)
1、基本类型:形式参数的改变不影响实际参数 。
2、引用类型:形式参数的改变直接影响实际参数。
<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;">class StudentDemo {
//如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
public void method(Student s) { //调用的时候,把main方法中的s的地址传递到了这里 Student s = new Student();
s.show();
}
}
</span></span>
三、匿名对象
<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;">A a = new A();
new A();//匿名</span></span>
四、封装和private关键字
1、封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2、private: 是一个权限修饰符,可以修饰成员变量和成员方法,被其修饰的成员只能在
本类中被访问。
3、封装和private的应用:
- 把成员变量用private修饰,类内部访问。
- 提供对应的getXxx()和setXxx()方法。
五、this关键字
1、this:是当前类的对象引用。
- 简单的记,它就代表当前类的一个对象。只有对象才能调用方法。
- 谁调用这个方法,在该方法内部的this就代表谁。
2、this的场景: 解决局部变量隐藏成员变量
3、内存图解:
六、构造方法
1、构造方法的注意事项:
- 如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
- 如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
- 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法。
2、给成员变量赋值有两种方式:(Spring的Ioc方式,其实也是属性输入与构造方法注入)
- setXxx()
- 构造方法
七、创建对象做了哪些事情
八、static关键字
1、 static的特点:
- 它可以修饰成员变量,还可以修饰成员方法,还可以修饰成员内部类。static 修饰的内容称其为:与类相关的,类成员。
- 随着类的加载而加载,优先于对象存在 ,在构造方法执行之前,更在创建对象之前。
- 静态方法中是没有this关键字的。静态是随着类的加载而加载,this是随着对象的创建而存在。
- 存放在方法区,被类的所有对象共享。
- 推荐使用类名调用。
- 静态方法只能访问静态的成员变量和静态的成员方法 。简单记: 静态只能访问静态。
2、举例:咱们班级的学生应该共用同一个班级编号。
- 如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
- 举例:饮水机(用静态修饰),水杯(不能用静态修饰)
3、内存图:
九、final关键字
1、final可以修饰类,方法,变量
2、特点:
- final可以修饰类,该类不能被继承。
- final可以修饰方法,该方法不能被重写。(覆盖,复写)
- final可以修饰变量,该变量不能被重新赋值。因为这个变量其实是常量。
3、面试题:final修饰局部变量的问题?
- 基本类型:基本类型的值不能发生改变。
- 引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。
4、 final修饰变量的初始化时机
- 被final修饰的变量只能赋值一次。
- 在构造方法完毕前赋值(非静态的常量),即只能在定义的时候(推荐)和构造方法中赋值。
- 静态的是在类加载器加载的时候,即final static 定义的时候即要赋值。
5、继承的代码体现 :由于继承中方法有一个现象:方法重写。 所以,父类的功能,就会被子类给覆盖掉。有些时候,我们不想让子类去覆盖掉父类的功能,只能让他使用。使用final关键字。
十、多态
1、前提
1)有继承或者实现关系。
2)要有方法重写。
- 其实没有也是可以的,但是如果没有这个就没有意义。
d.show();
动物 d = new 狗();
d.show();
3)有父类或者父接口引用指向子类对象。
- 父 f = new 子();
1)成员变量
- 编译看左边,运行看左边。
2)构造方法
- 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
3)成员方法
- 编译看左边,运行看右边。
4)静态方法
- 编译看左边,运行看左边。
- 静态和类相关,算不上重写,所以,访问还是左边的。
- 由于成员方法存在方法重写,所以它运行看右边。
3、内存图
4、 对象转型
1)父类访问子类的功能:
- 创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
- 把父类的引用强制转换为子类的引用。(向下转型)
2)对象间的转型问题:
- 向上转型: Fu f = new Zi();
- 日常开发中,接口的使用最为常见
- 向下转型: Zi z = (Zi)f;
- 要求该f必须是能够转换为Zi的,不然报ClassCastException-类型转换异常。
3)对象转型的内存图