Java面向对象的三大特征(封装、继承、多态)

java面向对象编程是一种编程思想,有三大特性,封装,继承,多态。对于一个类而言, 如何封装 呢?继承是父类和子类的关系, 继承关系如何实现的呢?父类和子类继承时的方法体是怎么样的关系呢?多态是多个类之间的关系,类有不同的行为和属性,其他类也有这样的方法和属性,就实现了多态的关系,不同类的多态实现是怎么样实现的呢?

封装:(目的是保护属性不会被随意修改)

谈到封装,java中有三类访问权限修饰符 protected,private,和public,没有加访问修饰符的,一般为包级可见,public 顾名思义,就是所有的类和包都能调用,protected 当前类和同一个包还有子类都可以调用,private则只有当前类可以调用

什么是封装:

设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。

如何封装?

1.private私有化属性()关键字;
2.提供公共的get set作为入口出口;
3.赋值的时候调用setter,获取值的时候调用getter;
4.如果有有参构造,则赋值时建议调用setter方法,保障逻辑性完全。

封装的好处:

  1. 提高数据的安全性。
  2. 操作简单。
  3. 隐藏了实现。

继承:(目的是把多个公共属性提取到一起作为一个父类)

什么是继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系

继承是类与类的一种关系,是一种“is-a”的关系。

注意:java中的继承是单继承,一个类只能有一个父类

如何继承

class 父类 {
    属性;
    方法;
}
 
class 子类 extends 父类 {


}

其他类用extends关键字可以继承父类,可以继承所有属性和方法(私有的属性和方法不可见)

继承的时候,创建子类对象必须先隐式创建父类对象,只要父类有无参构造,创建子类时,会先执行父类无参,如果父类只有有参构造,这时候入,没有无参构造,子类的构造方法就会失效,除非子类用super()显式调用父类有参构造;

super关键字

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}

class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法
  }

public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}

final关键字

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写

因为所有的构造方法都来自object类
object类是所有类型的父类;

继承的初始化顺序

1、初始化父类再初始化子类

2、先执行初始化对象中属性,再执行构造方法中的初始化。

基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:

父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法。

多态

多态指的是同一个对象可以表现出多种形态,通俗来说就是一个对象的引用类型既可以是实际类也可以是实际类的父类。

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}
public class Cat extends Animal {
    
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void playGame() {
        System.out.println("猫玩耍");
    }
}
public class Test {
    public static void main(String[] args) {
        //有父类引用指向子类对象,向上转型
        Animal a = new Cat();
        Cat c = new Cat();
        a.eat; // 猫吃鱼

        // 向下转型
        Cat t = (Cat) a;
        //向下转型记得要强制类型转换,

    }
}

以上代码还涉及到了多态中的向上转型和向下转型问题,Animal a = new Cat();是一种向上转型,相当于定义了一个Animal类型的引用变量a指向一个Cat类的对象,Cat t = (Cat) a是向下转型,将Animal类型的引用比那里a传给了Cat类型的引用变量t,两者在成员变量和成员方法上的调用有所区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值