面向对象的三大特性:封装,继承,多态
封装: 对象的便捷对对象的内部起到保护作用:
数据隐藏(四种访问修饰符)
public 公开 可以继承
default 本类和同包可以访问 如果一个属性既不是public也不是private 那就默认是default 同包的子类可以继承
private 私有 只能在本类内部访问 无法突破边界 不能继承
protected 受保护的 本类+同包+不同包的子类都可以访问 可以继承
private protected 只能修饰属性、方法、构造方法
default public 可以修饰属性、方法、构造方法、类
构造方法不能继承!
方法的覆盖
子类用特殊的方法实现替换掉父类继承给它的一般的方法实现
(也就是说计算机在子类中找到了需要调用的方法,就不用去调用父类的方法了)
父类的静态方法(static)不能被子类覆盖
注意:子类替换父类的方法的时候,不能改变父类构造方法的返回值类型,方法名,参数表,访问修饰符相同或更宽
属性私有 提供公开的setXXX/getXXX用来访问属性
字符串名.length() 字符串长度
方法私有 只给自己调用
方法公开 声明公开(你只需要知道能做什么) 实现隐藏(不需要知道怎么实现的)
实现的改变对架构的影响最小
<<左移一位 乘2 >>右移一位 除2
继承:
父类:子类的共性抽象出来的 比如动物是猫狗鸡鸭鱼鸟等的父类
class b{}
class a extends b{} a是b的子类
只有子类能够访问到的父类的属性和方法,才算是子类继承的
继承的作用:
1.使代码可重用,大大减少了写重复代码的次数
2.增强程序的可扩展性
3.增强程序的可维护性
4.使人们能够更加清晰的看清楚各个对象之间的联系
对象的构造过程
1.分配空间 本类+父类 一并分配
2.递归的构造父类对象()
3.初始化本类属性
4.调用本类构造方法
例如A<–B<–C
创建C对象:
如果第一次(创建对象 || 访问类的静态成员 || 加载子类)需要类加载(只会执行一次)
(1)加载父类A 执行A的静态代码块
(2)加载父类B 执行B的静态代码块
(3)加载子类C 执行C的静态代码块
1.分配空间
2.初始化A属性和A的初始代码块(动态代码块)
3.调用A的构造方法
4.初始化B属性和B的初始代码块(动态代码块)
5.调用B的构造方法
6.初始化C属性和C的出事代码块(动态代码块)
7.调用C的构造方法
super
1.引用:父类对象
访问父类被遮盖的属性或调用被覆盖的方法
2.用在构造方法中 指定调用父类的哪一个构造方法
必须是构造方法中的第一个语句
如果一个构造方法的第一句话,不是this(…),也不是super(…),系统默认添加super();
常常用来把构造参数传给父类,去设置父类的属性!