继承中子类里的构造方法 都会默认存在一个父类的构造方法super(); { 可以自己写不然默认有一个super() }
子类的成员属性如果没有 this.会继承父类
先输出父类的构造方法 再输出本类的
如果父类上面还有父类 那么优先输出爷爷类的构造方法 从上往下输出
重载与重写
重载: 方法名相同参数表不同
重写(方法覆盖): 继承体系同,子类出现了和父类一样的方法声明(修饰符相同或更宽,返回值类型,方法名,参数列表,不能比父类抛出更对的异常)
子类中重写父类方法 返回值类型必须一致 传参不一致叫重载
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
权限修饰符
修饰符 | 同一个类中 | 同一个包中子类无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private [ 私有 ] | √ | |||
default [ 默认 ] | √ | √ | ||
protected [ 受保护的 ] | √ | √ | √ | |
public [ 公开的 ] | √ | √ | √ | √ |
final
final关键字是最终的意思 可以修饰 成员方法,成员变量 ,类
不可以被重写 不可以被继承
变量类型是基本类型: final修饰指的是基本类型的数据值不能发生改变
变量类型是引用类型: final修饰指的是引用类型的地址值不能发生改变 , 但是地址里面的内容是可以发生改变的
对于final属性系统不会提供默认值
如果final修饰实例变量 可以在初始化属性或者构造方法,动态代码块中赋值
如果final修饰类变量 可以在初始化属性或者是静态代码块中赋值
static
static 关键字是静态的意思 可以修饰 成员方法,成员变量
静态成员方法只能访问静态成员
静态内容优先于非静态
静态代码块比构造方法先执行
1 静态方法中只能直接访问静态成员(属性,方法)
静态是随着类的加载而加载优先于对象
非静态的属性和方法依赖于对象才能使用
(main方法中 能直接调用的方法只有静态方法)
2 静态方法中可以使用静态成员,也可以使用非静态成员(但是需要new 对象)
3 静态方法中 没有this关键字(this 代表当前对象 随着对象的存在而存在)
多态
父类 变量 = new 子类();
成员变量: 编译看左边,执行看左边 (父类有这个变量 才可以编译成功 执行是父类的变量结果)
成员方法: 编译看左边,执行看右边 (必须父类有这个方法才行 如果子类重写了 那么结果是子类重写后的)
因为成员方法有重写,成员变量没有
1 对象类型不变 ---> 一个对象从创建好之后它的实际类型绝对不会发生改变。你从出生就一直是一个人。。。
2 只能对引用调用其引用类型中声明的方法 -----> 说白了只能调用父类中属性和方法
3 运行时,会根据对象实际类型找子类重写之后的方法---->当子类对象放进父类引用,该引用调用方法,如果子类重写了该方法,就调用子类的。
多态中的转型
向上转型
子类引用赋值给父类引用 可以直接赋值 (向上转型)
父类引用赋值给子类引用 必须强制类型转换 虽然能保证编译通过但是运行时可能发生类型转化异常 (向下转型)
所以在强制类型转换之前 可以用instanceof判断 避免出现异常
抽象
abstract class Super{
public abstract void method();
public void method2(){} //也可以写普通方法
}
抽象无法被实例化 如要实例化可以通过子类继承重写方式实例化 ( 抽象父类中的抽象方法子类必须都要重写 否则会报错 )
我们说抽象方法只有声明没有实现,一个方法应该是有声明和实现的
抽象方法没有实现是不完整的方法,就是说你这个方法没写完 也就意味
抽象方法所在的类是个半成品所以我们推出结论
如果一个类中有抽象方法 这个类必须是抽象类,就不能再去创建对象,
但是抽象类中不一定有抽象方法 但是可有有构造方法
(构造方法不只是供本类使用,有可能供子类super()去调用)
抽象类的特点
1 如果一个类中有抽象方法 这个类必须是抽象类,就不能再去创建对象,
2 抽象类中不一定有抽象方法 但是可有有构造方法(构造方法不只是供本类使用,有可能供子类super()去调用)
3 抽象类不一定有抽象方法, 抽象方法一定方法抽象类中
4 子类继承抽象类 如果子类不希望也成为抽象类 它就必须实现父类中声明的所有抽象方法.
合法: private static final 都能用 但是都不能和抽象联用
不合法: final abstract //不能被重写
static abstract //抽象是配合多态用的 静态是没有多态的
private abstract //不能被继承
接口
接口用关键字interface修饰
public interface 接口名{}
类实现接口用implements表示
public class 类名 implements 接口名 {}
接口不能实例化
接口如何实例化? 参照多态的方式 通过实现类对象实例化, 这叫接口多态
6 条评论
1
1
1
1
1
1