java的封装继承和多态

this
在每个类的内部,都有一个隐含的成员变量,该类的类型就是该类的类型,该成员变量的名称是this,this是一个引用,指向自身的对象。
this的用法:
         1、this调用本类中的属性,也就是类中的成员变量
         2、this调用本类中的其他方法
         3、this调用本类中的其他构造方法,调用时要放在构造方法的首行

java的封装继承和多态_第1张图片
面向对象特征之封装(Encapsulation)
为什么要使用封装?
     1、比如打电话,我们只要按键拨打就可以,不需要知道手机的内部结构,也不需要知道怎么打出去
     2、比如给手机充电,只要通过手机提供的接口,就可以,不需要知道怎么把电冲进去的

封装的含义?
     1、隐藏对象内部的复杂性,只对外公开简单的接口,便于外界使用,从而提高系统的扩展性、可维护性

 使用访问权限修饰符,实现封装
Java用于限定其他对象对该类内部定义的访问权限
有public、protected 、private、default(不写)四个
java的封装继承和多态_第2张图片
对于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方法
}
java的封装继承和多态_第3张图片
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强制转换之后,就可以访问狗里面的属性了
     }
}






















  









你可能感兴趣的:(JavaSe)