疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java三大特性封装,继承,多态


 

  

  一:封装

  (1)抽象:处理各种问题的第一步,把具体的问题与解决问题的方法结合起来,这就是抽象的过程.

  (2)Java常见的访问控制修饰符:

  Public:到处都可以访问,不受包和父子类关系的限制

  默认:只在同包内可以访问,不受父子类关系限制

  Protected:不同包的子类和同包的类中访问,这是一种继承访问。

  Private:只有自己类内部能访问,其他部分无论包内外,父子类都不能 访问

  Final:修饰属性:常量,值不能被修改

  注:要么在声明时候赋值,要么在构造方法中赋值,两次机会只能选取一次。

  修饰方法:final方法子类不能将其重写

  (3)修饰类:该类不能有子类

  (4)Static:修饰属性:静态属性是类所有实例共有,可以用”类名.属性”的方式访问,对于数值型变量,系统会

  给定初始值,不强制要求赋初始值.

  (5)方法:可以用”类名.属性”的方式访问,方法也为类的所有实例所共有

  (6)代码块:加载的优先级最高,甚至比主方法的加载还要早.

  对于由finalstatic共同修饰的变量,赋值的机会有两个,一是在声明的时候,二是在静态代码块中,两次机会有

  且只能有一次被选择.

  (7)get/set方法;对某一个属性只提供get不提供set方法,就是只读的,在类的外部不能修改;

  二:继承

  1:

  (1)继承是允许存在父子类的关系,一个子类有且只有一个直接的父类(Java中的继承是类之间的单继承.)

  (2)属性的例子:Fatherf=newSon();属性访问到的是父类的,方法访问到的是子类的.

  (3)方法的重载:在类的内部一种方法出现多种表达方式,如参数表的不同,构造方法的重载

  (4)方法的重写:发生在父子类之间,子类方法对父类的方法有新的实现方法,但两个方法定义部分完全一致.

  (5)继承的目的:实现代码的复用.理顺类型对象之间的结构关系.

  (6)构建一个父类的时候,要求他的子类与父类必须有理论上的确实的继承关系

  (7)任何父类适用的地方,子类一定适用;

  extends:继承,实际上是对父类的扩展;

  生成对象的过程是怎么样的?

  1)分配对象空间;

  2)给属性赋初值;boolean:false;数值类型:0或0.0;对象类型:null;

  3)调用构造方法;

  2:代码复用的方法:

  继承复用,完全的将父类非私有部分作为子类的内容,若需变化,子类只要重写父类的同名方法即可。

  在代码的类之间关系的设计阶段,理论上要求父子类之间没有相同的同名方法.但语法允许子类重写父类的方法.要

  求子类当中只有自己特有的方法和属性,其他部分与父类和其他同级子类相同的部分都从父类继承得来.

  3:有关抽象类:

  (1)抽象类是用于描述自然界中层级较高的对象类,人们无法对一个抽象类实例化,如动物。只能用一个动物类

  的子类对抽象类的对象进行实例化。

  (2)抽象修饰符abstract可以修饰类,修饰方法。

  (3)抽象类中可以定义非抽象的方法,但如果一个类中有抽象方法,则这个类必须被定义成抽象类。抽象类中有

  构造方法,但是没有抽象的构造方法。构造方法的存在完全是为了继承关系而存在。

  (4)与之形成对比的就是接口,接口中的所有方法要求定义成公开抽象方法,因为这些方法所表示的就是标准,

  标准的信息必须做到公开化,透明化,例如体育竞赛中的规则。

  (5)抽象类就是类,接口就是接口,都处于较抽象的层级而使它们具有相近的特性。(接口可以看成是一个特殊的

  抽象类)

  3:自己写的例子

  自己写this()就不会加super();但this()调用的构造方法一定会调用父类的构造方法;

  This(…);

  //表示调用本类的其它构造方法,只能出现在构造法的第一行;其它位置都是不//合法的;

  publicAnimal(Stringname,intage,intlegs)

  {

  //super();//系统默认加一个super();

  this.name=name;

  this.age=age;

  this.legs=legs;

  }

  publicAnimal(Stringname,intage,intlegs)

  {

  //super();//系统默认加一个super();

  this.name=name;

  this.age=age;

  this.legs=legs;

  }

  Super(…);//调用父类的构造方法,也是只能出现在构造方法的第一行;根据参数类型来确定调用父类的哪个构造

  方法;

  Super();//默认调用父类的无参的构造方法;

  即使把父类的私有属性继承下来了,但是还是不能直接访问,必须用getName();

  如果在子类中定义一个和父类相同的属性name,那么在子类中用super.getName()来和子类的name区分;

  总结:

  Super.xxx;//在子类中有和父类同名的属性时;

  this.xxx//方法中有局部变量和成员变量命名冲突

  Super(xxx);//调用父类的构造方法,只能出现在构造方法的第一行;

  this(xxx);//调用本类的其它构造方法,也是只能出现在构造方法的第一行,不能和this同时出现;

  如果在子类中定义和父类同名的属性是不推荐的,一般不要这么写;也没有意义;也不符合规范的;

  方法是经常覆盖的;

  方法的覆盖:

  1)发生在父子类中;

  2)同名、同参、同返回值

  3)访问权限跟父类相同或更宽;不能比父类更封闭;

  4)子类方法抛出异常的类型不能比父类方法更宽泛;

  Move()//父类;move(int)//子类;不叫覆盖,也可以叫重载;

  三:多态

  1:多态是:一个接口多种实现,可以理解为一种语法上的允许,表现形式多样。 (1)以下的代码表达都可以认为

  是Java多态性的具体表现:

  IAia=newTestIA();其中IA为定义的接口,TestIA为接口的实现类

  Fatherf=newSon()其中Father为父类,Son为子类

  Animala=newDog()其中Animal为抽象类,Dog为Animal类的子类.

  (2)Java中的多态基本上是由接口实现的,抽象类与子类之间的多态只占一少部分,接口是在Java中抽象层级最

  高的一类,其内部的定义是纯抽象的,属性的定义是公开静态常量,纯抽象的方法和常量属性构成一个标准,其所有

  的实现类,包括抽象类都要遵守接口中定义的规则。

  (3)Java类中的通信方式最好是以接口的形式进行值或对象的传递,如灯泡与台灯的关系。无论将何种类型的对

  象作为参数,只要是接口对象的一个实现类,就可以成为一个合理的参数.

  (4)将两个模块的内容以接口的方式进行通信,可以使两个模块的开发方式相对独立,不依赖于任何一个模块的

  已实现的信息。对于多态不必要下明确的定义,只需要理解它的表现形式以及意义。接口的存在表面上是实现一种

  多态语法,实际上是实现了Java中的多继承方式,一个类可以同时继承一个类,并实现另一个或多个接口,以同时

  获得多个类型的信息(包括属性和方法)。

  4:生动例子

  abstractclassAnimal

  {

  abstractvoideat();

  }

  classPigextendsAnimal

  {

  publicvoideat()

  {

  System.out.println("饲料");

  }

  publicstaticvoidsleep()

  {

  System.out.println("睡觉");

  }

  classDogextendsAnimal

  {

  publicvoideat()

  {

  System.out.println("骨头");

  }

  publicstaticvoidPao()

  {

  System.out.println("跑");

  }

  }

  classCatextendsAnimal

  {

  publicvoideat()

  {

  System.out.println("吃鱼");

  }

  publicstaticvoidcachmouth()

  {

  System.out.println("抓老鼠");

  }

  }

  classtest

  {

  publicstaticvoidmain(String[]ats)

  {

  //eatfunction(newCat());

  //eatfunction(newDog());

  //eatfunction(newPig());

  //引用类型的强制转化!

  //Animala=newDog();//类型提升!

  //Dogd=(Dog)a;

  //d.Pao();

  //d.eat();

  eatfunction(newDog());

  eatfunction(newCat());

  eatfunction(newPig());

  }

  publicstaticvoideatfunction(Animala)

  {

  a.eat();

  if(ainstanceofCat)

  {

  Catc=(Cat)a;

  c.cachmouth();

  }

  elseif(ainstanceofDog)

  {

  Dogd=(Dog)a;

  d.Pao();

  }

  elseif(ainstanceofPig)

  {

  Pigp=(Pig)a;

  p.sleep();

  }

  }

  }