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

封装

顾名思义,就是将数据封装起来,提高数据的安全性。我们程序都是要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,低耦合;仅暴露少量的方法给外部使用。

封装的关键字是 private。例如:

public class Tao{
    private int age;
}
public static void main(String[] args){
    Tao a=new Tao();
    a.age//这里是直接报错的
}

a.name报错原因就是属性已经被私有化,外部无法直接使用。如果要操作私有化属性的话,就可以创建一个set,get方法。相当有给外部提供一个接口。

public class Tao{
    private int age;
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return this.age;
    }
}
public static void main(String[] args){
    Tao a=new Tao();
   a.setAge(18);
}

由上可以看到,我们就可以通过一个set的方法进行赋值,get方法就是取值。

为了数据的一些有效性,我们可以在set方法里面进行一些数据验证

public class Tao{
    private int age;
    public void setAge(int age){
        if(age>0&&age<110){
          this.age=age;  
        }else{
           this.age=18; 
        }
        
    }
    public int getAge(){
        return this.age;
    }
}

上面可以看到,我对年龄进行了一个验证,传入的年龄值只能小于110岁和必须大于0岁,否则的话,我就给了一个默认值18。就不能像没有封装前,随便操作了吧。

然后总结一个封装的好处:

  • 提高程序的安全性,保护数据。
  • 隐藏代码的实现细节。
  • 统一接口。
  • 系统可维护增加了。

继承

继承(extands)的本质其实对某一类进行抽象化,继承是类与类之间的一种关系。除此之外,类与类之间还有依赖,组合,聚合等关系,继承关系的两个类,一个为子类(派生类),一个父类(基类),子类继承父类,关键词是extands来表示。子类和父类的关系从意义上讲具有 is a的关系。在java里面都是没有多继承,都是单继承。子类可以继承父类所有的属性和方法。但是如果父类属性设置了成私有的,子类那就继承不到。

  1. object类

    在java中,所有类都继承object类,只是Java给隐藏掉了,就像无参构造方法一样。

  2. super

    super关键字跟this关键字一样,不过this指的是当前本类,而super指的是父类。它可以调用父类的方法和属性。this和super不能同时调用构造方法,super只能出现在子类的方法或者构造方法中。

  3. 重写

    需要有继承的关系,子类重写父类的方法。

    • 方法名必须相同
    • 参数列表也必须相同
    • 修饰符范围可以扩大,但不能缩小
    • 抛出的异常范围可以缩小,但不能放大。
    • 方法体可以不同
    • static,final,private修饰的方法都不能被重写。

​ 为啥用重写呢,基本就是父类的满足不了子类的需求。

在普及一下重载,重载需要:

  • 方法名相同
  • 参数类型,个数,顺序不同
  • 返回类型可以相同,可以不同。

多态

即同一方法可以根据发送对象的不同而采取多种不同的行为方式。一个对象的实际类型是确定的,但是可以指向对象的引用类型却有很多。

多态存在的条件:

  • 有继承关系
  • 子类重写父类方法
  • 父类引用指向子类对象

注意:多态是方法的多态,属性没有多态性。

案例:

//动物类(父类)
public class animal {
    public  void  eat(){
        System.out.println("父类");
    }
}
//狗类(子类)
public class dog extends animal{
    @Override
    public void eat() {
        System.out.println("我在吃骨头");
    }
}
//猫类(子类)
public class cat extends  animal{
    @Override
    public void eat() {
        System.out.println("我在吃鱼");
    }
}

//测试类
public class text {
    public static void main(String[] args) {
        animal c=new dog();
        animal d=new cat();
        c.eat();
        d.eat();
    }
}
输出结果是:
我在吃骨头
我在吃鱼

上面就是指的多态,父类的引用指向子类。由此可见,是不是多态可以使我们程序变得更加灵活。

Tags: