快捷搜索:

java的封装继承和多态

面向工具编程有三大年夜特点:封装、承袭、多态。

【履行顺序的优先级: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强制转换之后,就可以造访狗里面的属性了

}

}

您可能还会对下面的文章感兴趣: