1.继承
继承的特点
1)在Java中只支持类与类的继承关系,即只支持单继承,不支持多继承
格式:
class 父类名{}
class 子类名 extends 父类名{}
不能够出现 class 子类名 extends 父类名1,父类名2{}
2)虽然不支持多继承,但是可以多层继承
即对类的成员分层初始化--->先父类,然后子类
格式:
class 父类名{}
class 子类名 extends 父类名{}
不能出现
class 子类名 extends 父类名1,父类名2{}... // 不支持多继承
基本的注意事项:
子类继承父类 继承父类中的非私有的成员(成员变量/成员方法),因为被private修饰的只能在本类中
访问,外界类是访问不到的,但是可以公共方法间接访问
构造方法继承不了
如果继承不了 可以使用super访问
继承的使用
什么时候使用继承思想
1)不要为了使用部分功能而使用继承
继承关系有局限性,如果继承的父类中有其他方法,在继承中用不到就会造成程序"耦合",增加代码的复杂性
使用继承的核心思想
如果一个类A是类B的一种,或者类B是类A的一种(集合的关系,包含) 我们就使用继承思想
开发中需要遵循的"开发原则" 这不是技术 是一种思想
所以所有的设计模式(23种)都要遵循
"低耦合
高内聚"
耦合指的是代码中的类与类的关系问题,关系越多,耦合性越强
这样后期维护起来难度很大,多个类有关联,一旦一个有问题,影响很多
所以在开发中要想办法降低耦合性 ----> javaEE就是通过"反射技术",
耦合性在实际开发中 不能避免,只能降低
内聚指的是某个类执行某件事的能力
一个类能够解决的 最好不要关联 关联越多 耦合性越大
2.继承中的成员关系
子类继承父类
类的成员
成员变量
成员方法
构造方法
在继承关系中,关于构造方法他们的访问:
1)子类继承父类,不能继承父类的构造方法,
但是可以通过super访问父类的构造方法
(super:代表父类的空间表示(父类的对象的地址值引用))
2)super访问,如何访问呢?
子类继承父类,子类的所有构造方法都会默认的访问父类的无参构造方法
super() ;可以隐藏不写
存在继承关系,需要让父类的数据 先初始化,因为我的子类可能用到父类的数据!
而且super必须在第一行
如果子类继承父类 继承父类中非
成员变量访问问题
子类继承父类,子类的成员变量名称和父类的成员名称不一致的时候-----分别访问即可.
子类继承父类,子类的成员变量名称和父类的成员变量名称一致时,就近原则
先在子类的局部位置找,有就使用,
如果在类局部位置中没有,在子类的成员位置中找,有就使用,
子类的成员位置没有,那么在父类的成员位置中找,
如果有就使用,如果没有就报错了,说明当前整个就没有这个变量!
this代表当前类
super代表父类
this.变量名 当前类的成员变量名
super.变量名 父类的成员变量
super.方法名 父类的成员方法
子类的所有访问都会默认访问父类的无参构造方法
3.方法重写
方法重写 子类出现了和父类一模一样的方法(方法名,参数列表.返回值类型,权限关系符)
子类将父类的方法覆盖了 此时子类的功能除了继承父类的功能还有自己的新的功能,可以说此时子类 包含了父类
4.自定义常量----final关键字
方法重写时
父类的方法不需要被覆盖
final -----"状态修饰符号"
特点 ---最终的 无法更改的
不能继承
不能被重写
一般结合public static final使用------自定义常量
修饰的变量,只能被赋值一次,而且修饰成员变量,必须给一个常量值
修饰局部变量,赋值一次后,能够再次赋值了
所以
public static final Integer i = new Integer(100) ;
//jvm加载的时候需要加载Integer类的
Integer类--包装了基本类型int的值,是int类型的包装类类型,引用数据类型 (jdk7 自动拆装箱)
//final Student s = new Student() ;//地址值不能在改变
// s = new Student() ; //错了,被final修饰