封装回顾
面向对象的三大特征:封装、继承、多态。
l封装思想:合理隐藏(隐藏细节),合理暴露(提供访问入口)。
l封装体现:
属性的封装:私有成员变量,提供get和set方法。
功能的封装:在类中封装方法,方便功能复用。
l封装体现:
属性的封装:私有成员变量,提供get和set方法。
功能的封装:在类中封装方法,方便功能复用。
目标:掌握类成分和作用
类中成分
l类中可以定义的5大成分:成员变量、成员方法、构造方法、代码块、内部类。
修饰符 class 类名{
1、成员变量:描述类或者对象的属性信息,如:姓名、年龄。
2、成员方法: 描述类或者对象的行为的,如:唱歌、吃饭、买票。
3、构造方法: 初始化一个类的对象返回。
4、代码块:还没有学习。
5、内部类:还没有学习。
静态变量
1、成员变量的特点
成员变量随着对象的创建而在堆中存在
每个对象在内存中都有一份成员变量
问题:每当创建一个Chinese对象,对象中都包含country变量,浪费空间。
2、共享的成员变量
l有些成员变量信息,所有对象都是一样的,不需要每个对象都保存一份。
(比如同一个国家的国籍,同一个学校的校名)
l对于共用的,多个对象共享的成员变量,可以使用 static修饰。
static关键字
lstatic是静态的意思,被static修饰的变量称为静态变量或类变量。
格式:权限修饰符 static 数据类型 变量名;
举例:public static String country;
静态变量内存原理
l在首次创建对象之前,虚拟机需要对类进行加载。
l静态变量随着类的加载而创建(此时对象还没产生),在内存中只有一份,所有对象都可以共享使用。
静态变量:
static修饰的变量属于类,在类加载时创建(此时对象还没产生),在内存中只有一份,可以被这个类的所有对象共享访问。
静态方法
使用static修饰的方法,叫做静态方法。
格式:
修饰符static返回值类型方法名() {
…
}
调用方式:
l类名.静态方法名(); (推荐)
l对象名.静态方法名();
静态方法应用场景:
如果方法是以执行通用功能为目的,为了方便访问,即可以设计成静态方法(工具类方法通常是静态的)
l如果方法中需要访问对象的实例变量,则该方法必须定义成非静态方法。
静态方法应用_工具类
工具类作用:
将应用程序中通用的功能,抽取成静态方法,独立封装成工具类。
作用:方便方法的调用,提高代码复用。
工具类特点:
工具类的构造方法通常使用private修饰,不让外界创建对象。
JDK的java.util包中,有很多非常实用的工具类,如Arrays,Math等
继承概述
什么是继承?
l继承是将多个类的相同属性和行为抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独这个类即可使用这些属性和行为了。
l多个类称为子类(派生类),单独的这个类称为父类(基类 或超类)
继承的格式
格式:public class 子类名 extends父类名 {
}
继承的优点
继承的出现减少了代码冗余,提高了代码的复用性。
继承更有利于功能的扩展,子类继承一个父类就得到了父类的功能了。
继承的特点
Java类只支持单继承,不支持多继承。
Java类不支持多继承,但支持多层继承。
在子类中访问成员变量的特点
在子类方法中访问一个变量满足:就近原则
1.先找子类方法内的局部变量
2.然后找子类成员变量
3.最后找父类成员变量
l可以通过super关键字,直接指定访问父类的成员变量。
super.父类成员变量
在子类中访问成员方法的特点
如果父类和子类中,出现了相同的成员方法,也会优先使用子类的,如果一定要使用父类的方法,也是使用super关键字。
super.父类成员方法( );
面试题
1、子类是否可以继承父类的私有成员?
可以继承,但是子类不能直接访问。父类私有成员只能在本类中使用。
2、子类是否可以继承父类的构造方法?
不可以。构造方法名必须和类名相同,如果子类可以继承父类构造方法,将和语法规定产生矛盾。
子类访问父类构造方法
特点:子类构造方法执行前,会默认调用父类的无参构造方法。
原理:在子类构造方法的第一行,默认有super(),表示调用父类的无参构造方法。
原理说明:
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。所以,子类对象在初始化之前,要先调用父类构造方法,完成对父类空间的初始化。
简单理解,就是必须先有父亲,才能有儿子。
如果父类中没有无参构造器,只有带参构造器,会出现什么现象呢?
会报错。因为子类默认是调用父类无参构造器的。
如何解决?
子类可以调用父类有参构造器来初始化父类的数据。
格式:在子类构造器第一行,添加super(参数值) 代码。
注意:只能在子类构造方法的第一行去调用父类构造方法。
super与this
lthis:代表本类对象的引用。
lsuper:代表父类存储空间的标识。(可以理解为父类对象引用)
方法重写
什么是方法重写?
子类中对父类已有的方法重新实现功能。
当子类和父类有相同的功能,但父类的该功能不满足子类的需求时,子类可以重写父类中的方法。
方法重写的规则(了解)
方法名、参数列表、返回值类型都保持不变。
子类重写后的方法,访问权限要大于等于父类方法的权限。
(权限从小到大: private、缺省不写、protected、public)
私有方法和静态方法不能被重写。
@Override注解
加在重写的方法上,可以校验重写格式。
建议重写方法都加@Override注解,代码更安全优雅!
小结:方法重写时,通常保持定义格式不变,重新实现方法功能即可。
总结
- java中类只能单继承,但是允许间接多重继承。
2. 父子类出现同名的成员变量和成员方法时,优先访问子类的成员。(就近原则)
3. 可以使用super关键字在子类中对父类成员进行访问。
4. 子类无法继承父类的构造方法。
5.创建子类对象时,默认都会调用父类无参构造方法初始化父类的空间。
如果父类没有无参构造方法,可以使用 super(参数) 调用父类带参构造方法。
6. 子类可以对继承下来的父类方法进行重写。(方法格式不变,方法功能重写)
7. 子类不能重写父类的私有和静态方法。