java如何体现面向对象的主要特征(面向对象知识整理)

封装包含两方面含义:封装的要求:合理隐藏,合理暴露,今天小编就来说说关于java如何体现面向对象的主要特征?下面更多详细答案一起来看看吧!

java如何体现面向对象的主要特征(面向对象知识整理)

java如何体现面向对象的主要特征

封装

封装包含两方面含义:

  • 隐藏:将内部实现细节隐藏
  • 暴露:通过暴露的接口来操作对象。

封装的要求:合理隐藏,合理暴露。

封装主要是通过访问控制修饰符来实现

在 Java 中,实例变量通常使用private来修饰,将其隐藏。并提供相应的getter、setter方法,来控制该成员变量的访问。

如下代码所示,User类中有一个成员变量(name),要求name的长度在 10 位以内。

class User { private String name; public void setName(String name){ if (name.length > 10) { System.out.println("名称长度必须在10位以内!"); return; } this.name = name; } public String getName() { return this.name; } }

继承

继承最大好处是代码复用

Java 中继承是类与类之间的关系(而非对象与对象之间的关系),是一种由一般到特殊的关系(如苹果类(子类派生类)继承了水果类(父类超类基类)),子类的实例可以当作父类的实例来使用

在 Java 中,继承通过如下语法定义:

[修饰符] class 子类名 extends 父类 { // ... }

注意

  • Java 是单继承父类,只能有 1 个直接继承的父类
  • 如果不显式继承父类,Java 默认继承Object类。

子类可以调用父类非private修饰的成员变量方法(见上方访问控制表格)。

多态

多态是指同一个类型的多个实例,在执行同一个方法时,呈现出多种行为特征。

变量的类型

编译时类型:声明该变量时指定的类型。在 Java 程序编译阶段,Java 编译器只认编译时类型。当调用子类有而父类没有的方法,且使用向上转型时,编译器将报错。

运行时类型:该变量实际所引用的类型。

向上转型

子类的对象可以直接赋值给父类变量,其可以自动完成。

例如,Ostrich类继承了Bird类,那么定义Ostrich实例时可以进行如下定义:

class Bird { public void fly() { System.out.println("飞咯~"); } } class Ostrich extends Bird { @Override public void fly() { System.out.println("不会飞呀~"); } } public class Test { public static void main(String[] args){ Bird b1 = new Bird(); Bird b2 = new Ostrich(); b1.fly(); // 飞咯~ b2.fly(); // 不会飞呀~ } }

向下转型 (强制转换)

当使用向上转型特性时,想要调用子类方法时,需要强制转换成对应类型。

class Bird { public void fly() { System.out.println("飞咯~"); } } class Ostrich extends Bird { public void run() { System.out.println("跑得快呢"); } } public class Test { public static void main(String[] args){ Bird b1 = new Ostrich(); // b1.run(); // 无法编译 Ostrich b2 = (Ostrich) b1; b2.run(); // 正常编译 } }

注意

  • 强转运算符只能在编译类型具有继承关系的变量之间进行强转,否则编译将会报错(如String类型强转成Integer)。
  • 如果在编译类型具有继承关系的变量之间转换时,如果被转变量的实际类型不是要转换的目标类型,程序就会引发ClassCastException异常。

instanceof

为了避免ClassCastException异常,Java 提供了instanceof运算符。格式是变量名 instanceof 类型,当变量所引用的对象是后面类或子类的实例时,返回true。

instanceof 只能在具有继承关系的变量之间进行强转,否则编译将会报错,故当变量与类之间没有关系时,也不会返回false。

例如:

class Fruit {} class Apple {} public class Test { public static void main(String[] args){ Fruit fruit = new Apple(); if(fruit instanceof Apple) { Apple apple = (Apple)fruit; } } }

从 Java 16 开始,instanceof 运算符得到了升级。见本文最后Java 16 增强的 instanceof

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页