面向目标编程有三大特性:封装、承继、多态。
【履行次序的优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O),重载[一个类中]和重写【父子类中】】,
封装躲藏了类的内部完成机制,能够在不影响运用的情况下改动类的内部结构,一起也维护了数据。对外界罢了它的内部细节是躲藏的,露出给外界的仅仅它的拜访办法。
承继是为了重用父类代码。两个类若存在IS-A的联系就能够运用承继。,一起承继也为完成多态做了衬托。那么什么是多态呢?多态的完成机制又是什么?请看我逐个为你揭开:
所谓多态便是指程序中界说的引证变量所指向的详细类型和经过该引证变量宣布的办法调用在编程时并不确认,而是在程序运转期间才确认,即一个引证变量倒底会指向哪个类的实例目标,该引证变量宣布的办法调用到底是哪个类中完成的办法,有必要在由程序运转期间才干决议。因为在程序运转时才确认详细的类,这样,不必修正源程序代码,就能够让引证变量绑定到各种不同的类完成上,然后导致该引证调用的详细办法随之改动,即不修正程序代码就能够改动程序运转时所绑定的详细代码,让程序能够挑选多个运转状况,这便是多态性。
比方你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里边都装了白酒,从外面看咱们是不可能知道这是些什么酒,只需喝了之后才干够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒…。在这儿咱们能够描绘成如下:
酒 a = 剑南春
酒 b = 五粮液
酒 c = 酒鬼酒
…
这儿所体现的的便是多态。剑南春、五粮液、酒鬼酒都是酒的子类,咱们仅仅经过酒这一个父类就能够引证不同的子类,这便是多态——咱们只需在运转的时分才会知道引证变量所指向的详细实例目标。相当于一个父亲能够由多个儿子,可是,一个儿子只会有一个父亲。【多态】
弥补:为了更好的了解多态,咱们就有必要要了解什么是“向上转型”。在承继中咱们简略介绍了向上转型,这儿就在烦琐下:在上面的喝酒比方中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。咱们界说如下代码:
JNC a = new JNC();
关于这个代码咱们十分简略了解无非便是实例化了一个剑南春的目标嘛!可是这样呢?
Wine a = new JNC();
在这儿咱们这样了解,这儿界说了一个Wine 类型的a,它指向JNC目标实例。因为JNC是承继与Wine,所以JNC能够主动向上转型为Wine,所以a是能够指向JNC实例目标的。这样做存在一个十分大的优点,在承继中咱们知道子类是父类的扩展,它能够供给比父类愈加强壮的功用,假如咱们界说了一个指向子类的父类引证类型,那么它除了能够引证父类的共性外,还能够运用子类强壮的功用。
可是向上转型存在一些缺憾,那便是它必定会导致一些办法和特点的丢掉,而导致咱们不能够获取它们。所以父类类型的引证能够调用父类中界说的一切特点和办法,关于只存在与子类中的办法和特点它就望尘莫及了—1。
java的封装承继和多态
this
在每个类的内部,都有一个隐含的成员变量,该类的类型便是该类的类型,该成员变量的称号是this,this是一个引证,指向本身的目标。
this的用法:
1、this调用本类中的特点,也便是类中的成员变量
2、this调用本类中的其他办法
3、this调用本类中的其他结构办法,调用时要放在结构办法的首行
面向目标特征之封装(Encapsulation)
为什么要运用封装?
1、比方打电话,咱们只需按键拨打就能够,不需要知道手机的内部结构,也不需要知道怎样打出去
2、比方给手机充电,只需经过手机供给的接口,就能够,不需要知道怎样把电冲进去的
封装的意义?
1、躲藏目标内部的复杂性,只对外揭露简略的接口,便于外界运用,然后进步体系的扩展性、可维护性
运用拜访权限修饰符,完成封装
Java用于约束其他目标对该类内部界说的拜访权限
有public、protected 、private、default(不写)四个
关于class的权限只能运用public 或 default (不写)
怎么完成封装?
修正特点的可见性来约束对特点的拜访。为每个特点创立一对赋值办法和取值办法,用于对这些特点的拜访。
在赋值和取值办法中,参加对特点的存取的约束
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age 》 200){
throw new RunTImeExcepTIon(“老妖怪。。.。”);
}
this.age = age;
}
}
面向目标特征之二 承继(extends)
承继:是面向目标的最明显的一个特征。承继是从已有的类中派生出新的类,新的类能吸收已有类的数据特点和行为,并能扩展新的才能
比方上面的动物类,每一个动物都有姓名和年纪,都能叫,都会吃。可是详细每一种动物,又有自己特有的特点和行为,乃至相同的行为,也有千差万别。
承继是对某一批类的笼统,然后完成对实践国际更好的建模
进步代码的复用性
子类承继父类的语法格局如下:
修饰符 class subclass extends superclass {…。。}
public class Animal {
private String name;
private int age;
public void shout(){
System.out.println(“我的叫声很好听。。”);
}
//省掉get、set办法
}
public class Dog extends Animal{
public void eat() {
System.out.println(“我吃骨头。..”);
}
}
Java承继:
1、Java只支撑单承继,也便是只能承继一个类
2、假如一个类没有声明承继联系,默许承继Object类
3、子类承继父类悉数的操作(除了结构办法),假如父类中的特点是private的,归于隐
式承继,不能直接 操作,能够经过set、get办法进行操作
在子类中,能够依据需要对从基类中承继来的办法进行重写
重写办法有必要和被重写办法具有相同的办法称号、参数列表、和回来类型
重写办法不能运用比被重写办法更更严厉的拜访权限
public class Animal {
private String name;
private int age;
public void shout(){
System.out.println(“动物会叫。.”);
}
}
public class Dog extends Animal{
public void eat() {
System.out.println(“我吃骨头。..”);
}
@Override
public void shout() {
System.out.println(“汪汪。。汪汪。。。”);
}
}
Super:是直接父类目标的引证能够经过super拜访父类汇中被子类掩盖的办法或特点
一般办法:没有次序,恣意调用
结构办法:任何类的结构办法中,假如结构办法中没有显现的调用super(…),那么Java 会默许调
用super()作为父类的初始化办法,所以在写不写super()办法,没 有联系
面向目标特征之三-多态(Polymorphism):多态性是指答应不同软件元素对同一音讯作出呼应
把不同的子类目标都当作父类来看,能够屏蔽不同子类目标之间的差异,写出通用的代码,做出通用的编程,以习惯需求的不断改变。
赋值之后,父类型的引证就能够依据当时赋值给它的子目标的特性以不同的办法运作。也便是说,父亲的行为像儿子,而不是儿子的行为像父亲
履行期间(非编译期)判别所引证的实践类型,根基其实践类型调用相应的办法
父类办法&子类办法都在code Segment中
实践运转调用父类/子类办法?
即由实践运转期创立的目标类型来决议
前提条件:
承继
复写
父类引证指向子类
有多态,就能够升高代码的可扩展性!
class Animal{
public String name;
public Animal(String name){
this.name = name;
}
}
class Dog extends Animal{
public String folorColor;
public Dog(String name,StringfolorColor){
super(name); this.folorColor = folorColor;
}
}
class Cat extends Animal{
public String eyesColor;
public Cat(String name,String eyesColor){
super(name); this.eyesColor = eyesColor;
}
}
public class TestCasTIng{
public staTIc void main(String args[]){
Animal a = new Animal(“a”);
Cat c = new Cat(“c”,“cEyesColor”);
Dog d = new Dog(“d”,“dForlorColor”);
System.out.println(a instanceof Animal); //true
System.out.println(c instanceof Animal); //true
System.out.println(d instanceof Animal); //true
System.out.println(a instanceof Dog); //false
a = new Dog(“d2”,“d2ForlorColor”); //父类引证指向子类目标,向上转型
System.out.println(a.name); //能够拜访
//System.out.println(a.folorColor);
//!error 不能够拜访超出Animal本身的任何特点
System.out.println(a instanceof Animal); //是一只动物 System.out.println(a instanceof Dog); //是一只狗,可是不能拜访狗里边的特点
Dog d2 = (Dog)a; //强制转化
System.out.println(d2.folorColor); //将a强制转化之后,就能够拜访狗里边的特点了
}
}