目录
2.代码块 {} (重点:代码块的优先级,静态代码块,构造代码块,构造方法)
3.7、继承中构造方法的访问(子类如何访问父类的构造方法 )
10.形式参数问题和返回值问题----->只研究引用类型做形参
1.成员变量和静态变量的区别:
1)成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。
2)成员变量存在于堆内存中。
静态变量存在于方法区中。
3)成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。
4)成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。
2.代码块 {} (重点:代码块的优先级,静态代码块,构造代码块,构造方法)
2.1:代码块:
使用{}括起来的内容称为代码块。
2.2:分类:
- 局部代码块:在方法定义中使用。作用:限定局部变量的生命周期
- 构造代码块:在类的成员位置(类中,方法外),使用{}包裹起来 作用:给类中的一些成员进行 数据初始化。特点:每次在执行构造方法之前,如果存在构造代码块,先执行构造代码块中的内容!
- 静态代码块:static{},在类的成员位置 ----特点:随着类的加载而加载,优先于对象存在! 静态代码块就加载一次!
- 代码执行的优先级:静态代码块>构造代码块>构造方法
3.面向对象三大特征之继承 (extends)
3.1:什么是继承:
将多个类的共性内容抽取到一个独立的类中,然后让多个类和这个独立类产生继承关系。子类继承父类的的特征和行为,使得子类对象具有和父类的相同的行为和属性。
3.2:关键字:extends
3.3继承的书写格式:
class 父类{ 成员变量;成员方法;构造方法 }
class 子类 extends 父类{ }
3.4:继承的好处
1)提高代码的维护性2)提高代码的复用性3)类和类之间的继承关系,是“多态”特性的前提条件。
3.5:继承的特点
1)Java只支持单继承,不支持多继承(一个类只能有一个父类,不可以有多个父类。)2)支持多级继承
class A{//有一个父类A}
class B extends A{//子类B继承父类A}
class C extends B{//子类c继承父类B}
3.6:继承的弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。
3.7:什么时候使用继承
当两个类满足A是B的一种,就说明他们存在继承关系,这个时候可以考虑使用继承来体现。
3.5、继承的使用注意事项
1)子类继承父类:可以继承父类的非私有成员,私有的成员外界不能访问,只能在本类中访问,但是可以通过公共访问方法(set/get)访问。
2)构造方法是不能被子类继承的,但是子类要访问父类的构造方法,可以通过关键字super来访问。
3.6、继承类中,各成员间关系
成员变量/成员方法:遵循就近原则
如果子类的成员变量名称和父类的成员变量名称一致:先在子类的局部位置找局部变量名称,如果有,就使用。如果没有,就在子类的成员位置找,,如果存在,就使用。如果没有,直接在父类的成员位置中找,如果有,就是使用。如果没有,就没有这个变量,报错。
3.7、继承中构造方法的访问(子类如何访问父类的构造方法 )
1)子类继承父类,子类的所有的构造方法都会默认的访问父类的无参方法。
子类的所有构造方法的第一句话:默认隐藏了super() ;因为子类中会使用到父类的数据,所以在继承关系中得先让父类初始化.
构造方法:分层初始化!(先父类无参构造方法,再执行子类的构造方法)。
super:代表的父类对象的空间表示(父类对象的地址值引用!)
2)如果父类中的无参构造方法没有,子类会怎么样?
子类的所有的构造都会报错 ,因为子类所有构造方法默认父类的无参构造方法。
解决方法:
1:给出父类的无参构造方法。
2:在子类的构造方法中的第一句话,通过super(xxx),间接的访问父类的有参构造方法 。
3:只要子类的所有构造方法中一个能够让父类初始化即可!
在子类的有参构造方法中:this();访问本类的无参构造方法,然后在子类的无参构造方法中间接访问父类的有参构造方法super(xxx)。
一般情况子类的无参构造:默认访问父类的无参构造方法。子类的有参构造,直接访问父类的有参构造。
4.this和super的区别
1)概念的区别
this:代表的当前类对象的地址值引用
super:代表的父类的空间表示(父类对象的地址值引用)
2)使用不同
成员变量:
this.变量名 ; 访问的本类的成员变量
super.变量名; 访问的父类成员变量
构造方法:
this() ; 访问本类的无参构造方法
this(xx); 访问本类的有参构造方法
super() ;访问父类的无参构造方法
super(xx);访问父类的有参构造方法
成员方法:
this.方法名() ;访问本类的成员方法
super.方法名() ;访问父类的成员方法
5.什么是方法重写?
方法的重写(@Override):在继承关系中,子类出现了一摸一样的方法声明(权限修饰符,返回值类型,方法名,参数列表都相同),子类将父类的方法覆盖了,实现自己的业务逻辑
5.1重写和重载的区别
1:定义不同:重载是定义相同的方法名、参数不同,重写是子类重写父类的方法
2:范围不同:重载是在一个类中,重写是子类与父类之间的
3:多态不同:重载是编译时的多态性,重写是运行时的多态性
4:参数不同:重载的参数个数、参数类型、参数的顺序可以不同,重写父类子方法参数必须相同
5:修饰不同:重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围
6.final关键字
final是一种状态修饰符:表示无法更改的,可以用于方法、类、变量当中,一旦用final关键字修饰后,将不能改变final所修饰的引用。一般使用于不想让子类重写父类的功能
6.1final关键字的特点:
1:final修饰类,该类不能继承
2:final修饰变量,此时变量是一个常量(自定义常量)
编译时期常量:(jvm不需要加载) public static final 基本数据类型 变量名 = 值;
运行时期常量:(jvm需要加载) public static final 引用数据类型 变量名 = new xxx();
3:final修饰成员方法,该方法不能被重写(重写被 final 修饰的方法,编译时就会报错。)
修饰变量1. 局部变量 —— 基本类型基本类型的局部变量,被 final 修饰后,只能赋值一次,不能再更改public class FinalDemo1 { public static void main(String[] args) { // 声明变量,使用final修饰 final int a; // 第一次赋值 a = 10; // 第二次赋值 a = 20; // 报错,不可重新赋值 // 声明变量,直接赋值,使用final修饰 final int b = 10; // 第二次赋值 b = 20; // 报错,不可重新赋值 } }<