封装
定义:将一个类中的成员变量私有化,对该类提供一些公共的访问方法
关键字private:私有的/不能被访问的
被private修饰的成员变量/成员方法只能在本类中访问
关键字this:代表的是当前类的对象
一个标准类写法:
成员变量:全部私有化
构造方法
提供公共的访问的成员方法
形式参数的问题:
- 形式参数如果是基本数据类型:形式参数的改变对实际参数没有影响;
- 形式参数如果是引用数据类型:形式参数的改变,会直接影响实际参数
继承
定义:就是扩展已有类的功能,在继承中分子类和父类,父类有时候也称为超类(super类),子类有时称为派生类
基本语法格式: class 子类 extends 父类{}
特点:
1.在java中,只支持单继承,不支持多继承
例:
class son extends father ,grandfather{}(错误)
2.但可以支持多层继承
例:
class father extends grandfather{}
class son extends father{} (正确)
优点:
- 提高代码的复用性;
- 后期利于维护;
- 继承关系是多态的前提.
注意事项:
- 子类继承父类只能继承父类的非私有化的(成员变量或成员方法),要使用私有化的必须通过公共的访问方法;
- 子类不能继承父类的构造方法,只能通过super间接的去访问父类的构造方法;
- 不要为了部分的功能去使用继承,如果A类是B类的一种,并且体现的是”is a ”的关系,那么就使用继承
- 子类继承父类时,变量名的问题:
如果子类继承父类时,子类的变量名和父类名称一致时:(就近原则)
- 现在子类的局部位置找;
- 再在子类的成员位置找;
- 父类的成员位置找;
- 如果都没有,那么报错.
- 子类继承父类时,子类的所有构造方法,都默认访问父类的构造方法(先让父类初始化,再让子类初始化)
- 子类继承父类时,当成员方法名相同的情况下,如果子类的有输出子类的成员方法,如果没有看父类,父类有,则输出
关键字:
this:代表当前类的对象(子类的空间标识)
super:代表父类的对象(父类的空间标识)
应用场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
无参:
this();
super();
有参:
this(参数);
super(参数);
方法重写:override
定义:当子类出现和父类一模一样的方法声明时,子类的方法会重写(覆盖,复写)父类的方法,调用子类的方法
相近词:overload方法重载:
定义:一个类中,有多个方法名相同的方法,但参数列表不同,与返回值无关(只看方法名和参数列表)
- 参数列表不同;
- 参数类型不同.
例题:
子类继承父类时,如果父类的无参构造没有给出那么会发生什么?
代码报错
解决方法:
- 手动给出父类的无参构造;
- 在子类的构造方法中,间接通过super(有参)方法调用父类的有参构造,其中super的有参构造的参数只能随便给;
- 在子类的无参构造方法中,先去间接的访问本类中的有参构造方法[this(参数)];然后再通过本类中有参构造方法间接的访问父类中有参构造方法[super(参数)].
第三种方法,子类构造方法访问父类的构造方法,但是子类的无参构造方法,访问的是子类的有参构造方法
类的初始化:
- 初始化父类;
- 初始化子类.
多态
定义:某个事物在不同时刻体现出的状态
多态意味着一个对象有着多种形态,可以在特定的情况下,表现出不同的状态,从而对应着不同的属性和方法.通过程序来说:多态就是使用父类类型的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果
多态的前提条件:
- 必须有继承关系;
- 必须方法重写;
- 必须有父类引用指向子类对象: 向上转型
格式: 父类名 对象名=new 子类名();
将子类对象当作父类类型
--->父类类型变量引用不同的子类对象
多态的成员访问特点:
- 成员变量的访问特点:
编译看左,运行看左
- 成员方法的访问特点:
(1)非静态的成员方法:
编译看左,运行看右
(2)静态的成员方法:
编译看左,运行看左
- 构造方法:--->作用:给对象进行初始化
优点:
- 提高代码的扩展性;
- 提高代码的维护性.
弊端:
不能访问子类的特有功能
解决方法:
- 直接创建子类的引用对象;
- 向上转型--->即对父类对象进行强制类型转换
格式:子类名 对象名=(子类名)父类对象
在java中由于继承和向上转型,子类可以非常自然的转换成父类,但父类转换成子类则需要强制类型转换,因为子类比父类拥有更多的属性,更多的功能,所以子类需要强转--->由此可以得出一个结论,大转小可以自动转换,小转大需要强制类型转换
接口
定义:是抽象方法的集合,是一个特殊的类
格式: interface 接口名{}
class 类名 implements(实现) 接口名{}
类和接口是一种实现的关系
命名规则: 实现类--->接口名+impl
注意:
1.接口不能实例化;
2.接口的实现类不能是抽象类,接口本身不能实例化,需要通过子实现类来实例化.如果它的实现类也是抽象类的话,那么没有意义;--->扩展:如果类是抽象类的话,可以不实现接口中的所有方法;如果类不是抽象方法,必须实现接口中所有的方法
3.接口的实现类是具体类的话:
书写格式: 接口名 对象名=new 子实现类名(接口多态)--->推荐使用
成员特点:
- 成员变量:--->即全局变量
存在默认的修饰符:public static final
- 构造方法:
接口中没有构造方法
- 成员方法:--->即抽象方法
默认修饰符public abstract
扩展:
类,接口的关系的区别:
- 类与类的关系:
extends 继承关系,单继承
- 类与接口的关系:
implements:实现关系,并且可以多继承,
例:
class 类名 implements 接口名1,接口名2{}
- 接口与接口的关系:
extends 关系:可以是单继承,可以是多继承, 例:
interface 接口名1 extends 接口名2,接口名3