面向对象——三大特性

时光毁灭记忆、已成空白 提交于 2019-11-30 04:23:02

封装

定义

隐藏内部细节,提供公共的访问方法,便于调用。提高程序可展性、维护性。实现高内聚,低耦合

语法

私有化属性,提供公共的get/set方法

体现

属性、方法、构造器、内部类

class的权限修饰只可以用publicdefault(缺省)

核心是访问权限

访问权限

本类

同包

子类

其他

private

 

 

 

缺省

 

 

protected

 

public

 

好处

提高程序可展性、维护性。实现高内聚,低耦合

继承

定义

继承

多个类有相同的属性和方法时,将这些相同的属性和方法提取到一个类中,让多个类和这个类产生的一种关系

子类、超类、基类

此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”

语法

class Subclass extends Superclass{

//代码

}

好处

1继承的出现提高了代码的复用性。

2继承的出现让类与类之间产生了关系,提供了多态的前提。

3不要仅为了获取其他类中某个功能而去继承, 要考虑类之间是否有分类学关联

子类可以继承父类的内容

所有成员,不包括构造器

继承特性

1子类继承了父类,就继承了父类的方法和属性。

2在子类中,自动拥有父类中定义的方法和属性,也可以创建新的数据和方法。

3Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的扩展

继承规则

子类不能直接访问父类中私有的(private)的成员变量和方法。

 

 

单继承性

1Java只支持单继承,不允许多重继承

一个子类只能有一个直接父类

一个父类可以派生出多个子类

class SubDemo extends Demo{ }   //ok

class SubDemo extends Demo1,Demo2...//error

 

 

方法的覆盖(override)

定义:

1在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重写、重置。在程序执行时,子类的方法将覆盖父类的方法。

要求:

1覆盖方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。

2覆盖方法不能使用比被重写方法更严格的访问权限。

3覆盖和被覆盖的方法必须同时为非static的。

4子类方法抛出的异常不能大于父类被重写方法的异常

小结

1若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中

2对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量

 

多态

定义

同一对象,在程序不同时刻的额多种运行状态

体现

对象的多态性   

 子类对象的多种父类形态, 换言之就是把子类对象作为父类对象来使用.

引用变量的多态性

一个基本型变量只能有一种确定的数据类型

一个引用类型变量可能指向(引用)多种不同类型的对象

举例

Person p = new Student();

Object o = new Person();

//Object类型的变量o,指向Person类型的对象

o = new Student();

//Object类型的变量o,指向Student类型的对象

多态对象的确定

1Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。编译看左边,运行看右边

2若编译时类型和运行时类型不一致,就出现多态(Polymorphism

多态副作用

定义

一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法(多态副作用)

举例

Student m = new Student();

m.school = “pku”; //合法,Student类有school成员变量

Person e = new Student();

e.school = “pku”; //非法,Person类没有school成员变量

 

结论:

属性和方法是在编译时确定的,编译时引用变量ePerson类型,Person类型中并没有school成员变量,因而编译错误, 方法的使用也是一样

虚拟方法调用(Virtual Method Invocation)

定义

多态引用调用子类重写父类的方法

举例

正常的方法调用

    Person e = new Person();

   e.getInfo();

   Student e = new Student();

    e.getInfo();

  虚拟方法调用(多态情况下)

   Person e = new Student();

     e.getInfo(); //调用Student类的getInfo()方法

 

小结

前提:

需要存在继承或者实现关系

要有覆盖操作

成员变量:

不具备多态性,只看引用变量所属的类。

 

成员方法:

编译时:要查看引用变量所属的类中是否有所调用的方法。(编译时检查父类类型)

运行时:调用实际对象所属的类中的重写方法。

       (运行时执行子类类型)

instanceof 操作符

作用

x instanceof A:检验x是否为类A的对象,返回值为boolean型。

要求x所属的类与类A必须是子类和父类的关系,否则编译错误。

如果x属于类A的子类Bx instanceof  A值也为true

举例

public class Person extends Object {…}

public class Student extends Person {…}

public class Graduate extends Person {…}

-------------------------------------------------------------------

public void method1(Person e) {

if (e instanceof Person)

// 处理Person类及其子类对象

if (e instanceof Student)

//处理Student类及其子类对象

if (e instanceof Graduate)

//处理Graduate类及其子类对象

}

对象类型转换 (Casting )

1基本数据类型的Casting

自动类型转换:小的数据类型可以自动转换成大的数据类型

      long g=20;           double d=12.0f

强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型

             float f=(float)12.0;   int a=(int)1200L

2Java对象的强制类型转换称为造型

从子类到父类的类型可以自动进行

从父类到子类的类型转换必须通过造型(强制类型转换)实现

无继承关系的引用类型间的转换是非法的

在造型前可以使用instanceof操作符测试一个对象的类型

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!