封装:
就是隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
好处:隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存储控制语句,限制不合理操作。
封装权限控制符:
private default protected public
2.继承
在java中,继承通过extends关键字来实现。是java中实现代码中重要手段之一。java只支持单继承,即每个类只能有一个父类。继承表达的是is a的关系,或者说是一种特殊和一般的关系。
在java中,所有的java类都直接或者间接的继承了java.lang.long.Object类。Object 类是所有java类的祖先。在定义一个类时,没有使用extends关键字,那么这个类直接继承Object类。
子类可以从父类中继承的有:
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包中
继承默认权限修饰符修饰的属性和方法,但子类和父类必须爱同一个包中。
子类无法继承父类的有:
无法继承private修饰的属性和方法、无法继承父类的构造方法。
如果从父类继承的方法不能满足子类的需求,在子类中可以对父类的同名方法进行重写,以符合要求。
继承条件下构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法,这种情况下写不写super()语句效果都是一样的。
如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应的构造方法,而不执行父类无参构造方法。
如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
abstrac和final是功能相反的两个关键字,abstract可以用来修饰类和方法,不能用来修饰属性和构造方法,final可以用来修饰类,方法和属性,不能修饰构造方法。
多态:
多态的三个条件:
1.继承的存在(继承是多态的基础,没有继承就没有多态)
2.子类重写父类的方法
3.父类引用变量指向子类对象
子类转换成父类的规则:
将一个父类的引用指向一个子类的对象,称为向上造型,自动进行类型转换,此时通过父类引用调用的方法是子类覆盖或者继承父类的方法,而不是父类的方法,此时通过父类引用变量无法调用子类特有的方法。如果父类要调用子类的特有方法就得将一个指向子类对象引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。
多态:指的是同一个方法的调用,由于对象不同可能会有不同的行为。现实中,同一个方法,具体实现完全不同。
重载与重写
重载:
函数或者方法有相同的名称,但是参数列表不同。这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
重载是一种多态,这种说法也算对。首先所谓动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态。根据不同类型函数编译时会产生不同的名字,以此来区别调用。所以重载符合多态定义--通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。
重写、覆盖:
所以重载和多态无关,真正和多态相关的是重写(覆盖)。
当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态的调用派生类的对应的方法,这样的方法在编译期时无法确定的。因此这样的方法地址是在运行期绑定的(动态绑定)
重载只是语言特性,是一种语法规则,与多态无关,与面向对象无关。
重写一般多发生在不同类且存在继承关系之间,而重载多是在一个类里或者一段代码中。