继承和封装
Super
- super 和 this
- super:指代父类对象
- super使用在构造器的首行,调用父类的某个构造器
- super(参数列表)
- 使用在首行
- 默认在子类构造器的首行会调用父类空构造,如果显示定义super(参数),不会再默认调用父类空构造了
- 需求:当创建父类对象时,需要使用父类中的其他构造器,通过super(参数)显示定义调用哪一个,否则默认调用空构造
- 注意:this和super不能同时存在与构造器的首行调用构造器,除了显示定义this(),隐式调用super(),仅仅调用父类空构造
- 区分同名问题
- 如果存在子父类中成员同名问题,默认调用子类的,就近原则
- 如果不存在同名,默认调用父类,相当于省略了super.
- this和super都不能使用在static内容中
- 创建对象:先父类后子类(默认创建的父类对象在子类的内存空间中,外部无权使用默认创建的在子类内存中的父类对象,如果需要使用父类对象,自己手动创建父类对象)
*/
public class SuperDemo {
public static void main(String[] args) {
Zi zi=new Zi("heihei",14);
System.out.println(zi);
zi.info();
}
}
class Fu{
String name="呵呵";
int age;
public Fu() {
System.out.println("我是父类空构造");
}
public Fu(String name,int age) {
this.name=name;
this.age=age;
System.out.println("我是父类带参构造");
}
public void test(){
System.out.println("fU...........");
}
}
class Zi extends Fu{
int a;
String name="哈哈";
public Zi() {
//super();
super();
System.out.println("我是子类空构造");
}
//从父类中继承的某些成员属性赋值
public Zi(String name,int age) {
/*this.name=name;
this.age=age;*/
//super(name,age);
this();
System.out.println("我是子类带参构造");
}
继承
-
继承:
-
子承父业
-
使用继承的目的:
-
为了提高代码的复用性
-
父类|基类|超类
-
子类|派生类
-
如何使用继承:
-
定义子父类,使用extends关键字 子类 extends 父类
-
定义父类:抽取一系列子类的功能,定义为父类
-
子类一旦继承父类,就能够使用父类中的内容
-
子类可以定义自己独有的内容,扩展父类的功能
-
java中类只能单继承,可以多实现
-
继承: 延续+扩展
-
继承: 延续+扩展
-
但继承的优点:
-
使用简单
-
单继承的缺点:
-
局限性大,不便于后期维护
-
开闭原则:面向对象的设计原则之一
-
对修改关闭,对扩展开放
//定义一个父类
//子类中相同的内容
//子类继承父类,使用父类中的内容
class Person{
String name;
int age;
public void sleep(){
System.out.println("休息");
}
}
//子类 教师类 继承 Person类
class Teacher extends Person{
String subject;
public Teacher() {
// TODO Auto-generated constructor stub
}
public void teach(){
System.out.println("授课");
}
}
//学生类
class Student extends Person{
String schoolName;
public Student() {
// TODO Auto-generated constructor stub
}
public void study(){
System.out.println("学习");
}
权限修饰符
/*
- 权限修饰符: 内容被访问的权限
成员修饰符,不能修饰局部 - 能够修饰类:public|default(隐式定义)
- 私有的内容是不能继承的
protected使用途径: - 1.同包
- 2.不同包子类继承关系使用
重写与重载
-
重写 与 重载的区别:
-
重写:
-
1.不同的类
-
2.继承关系|实现
-
3.方法签名相同(方法名+参数列表)
-
测试一个方法是否为标准的重写方法:
-
1.重写方法左边会出现三角形
-
2.@Override 强制检测是否为重写方法
-
为什么要使用重写?
-
父类的功能你也有,但是实现体不一样,就可以对这个功能在子类中进行重写
-
调用: 如果子类中有重写方法,会调用子类的,否则调用父类的–就近原则
要求:
- == :方法签名完全相同
- <= :返回值类型如果是基本数据类型必须相等,如果是引用数据类型,子类<=父类
- <= :权限修饰符 子类>=父类
不能被重写的方法:
1.被private修饰的方法不能被重写
2.被final修饰的方法不能被重写
3.被static修饰的方法不能被重写
注意:如果子类中定义的方法名与父类静态方法的方法名相同,子类这个方法也要被static修饰,但是却不是重写方法
public class OverrideDemo {
public static void main(String[] args) {
new SiCong().words();
new SiCong().hehe();
}
}
class JianLin{
public JianLin words(){
System.out.println("先定一个小目标,挣他一个亿...");
return null;
}
public static void hehe(){
System.out.println("hhhhhhhhhhhhhhh");
}
}
class SiCong extends JianLin{
//重写: 父类的功能你也有,但是实现体不一样,就可以对这个功能在子类中进行重写
@Override
public JianLin words(){
System.out.println("我不在乎的我的朋友有没有钱,反正都没我有钱...");
return null;
}
//不是重写方法
public static void hehe(){
System.out.println("hhhhhhhhhhhhhhh");
}
}
2019.07.07