zoukankan      html  css  js  c++  java
  • 面向对象——三大特性

    封装

    定义

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

    语法

    私有化属性,提供公共的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操作符测试一个对象的类型

  • 相关阅读:
    VS编译cmake工程提示 “无法识别的标记”错误解决方法
    Markdown
    latex公式
    ros:time::now()详解
    c++中PROTOBUF遍历所有属性及值
    ORB-SLAM3相关博文
    WSL2安装及GUI图形界面配置踩坑指南
    ROS与PCL数据转换
    手眼标定中AX=XB求解方法及MATLAB、C++代码
    正则表达式用于数据清洗
  • 原文地址:https://www.cnblogs.com/houwenbo/p/11559507.html
Copyright © 2011-2022 走看看