Java轻松掌握面向对象的三大特性封装与继承和多态

目录
  • 1.封装
    • 1.介绍
    • 2.封装的理解和好处
    • 3.封装的实现步骤
  • 2.继承
    • 1.介绍
    • 2.继承的基本语法
    • 3.继承的使用细节
  • 3.super关键字
    • 1.基本介绍
    • 2.基本语法
    • 3.细节与好处
    • 4.super与this的比较
  • 4.方法重写
    • 1.基本介绍
    • 2.注意事项与使用细节
    • 3.重载与重写的比较
  • 3.多态
    • 1.基本介绍
    • 2.具体体现
      • 1.方法的多态
      • 2.对象的多态(重点)
    • 3.多态注意事项和细节讨论
      • 1.多态的前提
      • 2.属性
      • 3.instance of
      • 4.多态的向上转型
      • 5.多态的向下转型
      • 6.Java动态绑定机制
      • 7.多态数组多态参数

1.封装

1.介绍

封装是指把抽象出的属性和方法封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的方法,才能对数据操作。

2.封装的理解和好处

  • 隐藏实现的细节
  • 可以对数据验证,保证安全合理

3.封装的实现步骤

  • 将属性私有化(private)
  • 提供一个公共的set方法,用于对属性判断并赋值
  • 提供一个公共的get方法,用于获取属性的值
public class Student {
    private Double score;
    public void setScore(Double score) {
        //还可以在这里进行属性的判断
        this.score = score;
    }
    public Double getScore() {
        return score;
    }

2.继承

1.介绍

继承可以解决代码的复用,当多个类具有相同的属性和方法时,我们可以从中抽象出父类,然后再父类中定义这些相同的属性和方法,这样所有的子类就不需要再定义这些相同的属性和方法,只需要使用extends关键字来继承父类即可。

2.继承的基本语法

public class Graduate extends Student{
}
  • 子类会自动拥有父类定义的属性和方法
  • 父类又叫基类,超类
  • 子类又称派生类

3.继承的使用细节

子类继承了父类所有的属性和方法,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问。

package com.wang.extend;
public class Student {//父类
    public int age;
    public String name;
    private Double score;
    String hobby;
    public Double getScore() {
        return score;
    }
package com.wang.extend;
public class Graduate extends Student {//子类
    public void test() {
        //子类不能直接访问private属性,要调用公共方法得到
        System.out.println("大学生" + name + age + hobby + getScore());
    }
}

子类必须调用父类构造器,完成父类的初始化,当创建子类对象时,不管使用子类的哪一个构造器,默认会先去调用父类的无参构造器,若父类没有无参构造器,则必须在子类构造器中使用super()指定使用父类的哪个构造器完成父类初始化,否则编译失败。

package com.wang.extend;
public class Student {//父类
    public int age;
    public String name;
    //public Student() {
    //}
    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
package com.wang.extend;
public class Graduate extends Student {
    public Graduate() {
        // super();//默认会有一个调用父类无参构造的方法super()
        //若父类没有无参构造器,必须用super()指定使用哪个构造器
        super(20,"小明");
    }
}

super()在使用时,需要放在第一行。

super()和this()都只能放在构造器第一行,因此这两个方法不能同时存在于同一个构造器。

Java所有的类都是Object的子类。查看类的层级Ctrl+H。

父类构造器的调用不限于直接父类!将一直向上追溯到Object类(顶级父类)。

子类最多继承一个父类,java的单继承机制。

不能滥用继承,子类和父类要符合包含关系。比如,大学生包含在学生当中,这是学生就可以是父类,大学生为子类。

3.super关键字

1.基本介绍

super代表的是父类的引用,用于访问父类的属性,方法,构造器

2.基本语法

1.访问父类的属性/方法,但不能访问父类的private属性/方法

super.属性名; super.方法名(形参列表);

2.访问父类的构造器

super(形参列表);//只能放在构造器的第一句

3.细节与好处

1.父类属性由父类初始化,子类的属性子类初始化,分工明确。

2.当子类与父类的成员重名时,若要访问父类的成员,必须通过super。

3.super的访问不限于直接父类,当多个基类都有同名的成员,使用super访问时遵循就近原则。

4.super与this的比较

区别点 this super
访问属性 先访问本类的属性,若本类没有再去父类 只访问父类的属性
调用方法 先访问本类的方法,若本类没有再去父类 直接访问父类的方法
调用构造器 调用本类的构造器,必须放第一句 调用父类的构造器,必须放第一句
特殊 表示当前对象 表示子类访问父类对象

4.方法重写

1.基本介绍

子类的一个方法与父类的名称,返回类型,形参列表都一样,称子类是父类方法的重写。

2.注意事项与使用细节

1.子类方法的返回类型与父类方法的返回类型相同或者父类返回类型的子类。

//正确示例
public Object a()  //父类返回类型为Object
public String a()  //子类返回类型为String或者Object
//Object是String的父类

2.子类方法不能缩小父类方法的访问权限。

//接下来是错误示例
void display() //这是子类 子类访问权限为 默认的
public void display() //这是父类 父类访问权限为public
//public->默认的 访问权限变小所以报错

3.重载与重写的比较

名称 发生范围 方法名 形参列表 返回类型 修饰符
重载 本类 必须相同 参数类型,个数或者顺序中至少有一个不同 无要求 无要求
重写 父子类 必须相同 必须相同 子类的返回类型相同或者是父类的返回类型的子类 不能缩小父类的访问范围

3.多态

1.基本介绍

方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

2.具体体现

1.方法的多态

重写和重载体现多态。

//重载
public int sum(int a,int b);
public int sum(int a,int b,int c);
//重写
class A{
    public void say(){ System.out.printf("A是父类~");}
}
class B extends A{
    public void say() { System.out.printf("B是子类~");}
}

2.对象的多态(重点)

  • 一个对象的编译类型和运行类型可以不一致。
  • 编译类型在定义对象时,就确定了,不能改变,运行类型可以变化。
  • 定义时 = 的左边是编译类型,右边是运行类型。
Animal animal = new Dog();//Animal是编译类型,Dog是运行类型
animal = new cat();//编译类型不能改变,运行类型可变

3.多态注意事项和细节讨论

1.多态的前提

两个对象(类)存在继承关系。

2.属性

没有重写,属性的值是看编译类型。

public class Tes {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.n);
        //这里输出的是10,因为属性的值要看编译类型,a的编译类型为A,所以输出的是A的属性
    }
}
class A {
    public int n = 10;
}
class B extends A {
    public int n = 20;
}

3.instance of

比较操作符,是用来判断对象的运行类型是否为某类型或者某类型的子类型。

4.多态的向上转型

  • 本质:父类的引用指向了子类的对象。
  • 语法:父类类型 引用名 = new 子类类型();
  • 特点:可以调用父类中的所有成员(遵守访问权限),不能调用子类的特有成员,但最终的运行结果看运行类型的具体实现,能调用那些成员看编译类型,具体运行看运行类型。

5.多态的向下转型

  • 语法:子类类型 引用名 = (子类类型) 父类引用;
  • 只能强转父类的引用,不能强转父类的对象。
  • 要求父类的引用必须指向的是当前目标类型的对象。
  • 可以调用子类类型中的所有成员。
public class Test {
    public static void main(String[] args) {
        //向上转型
        A a = new B();
        a.say();
       //a.abc(); 方法abc为运行类型B类特有的编译类型A类不能调用
       //调用那些成员看编译类型,具体运行看运行类型
        //向下转型
        B b = (B) a;
        //父类的引用必须指向的是当前目标类型的对象
        b.abc();
    }
}
class A {
    public void say (){
        System.out.println("A类的say()被调用");
    }
}
class B extends A {
    public void abc(){
        System.out.println("B类的abc()被调用");
    }
    public void say (){
        System.out.println("B类的say()被调用");
    }
}

运行结果如下:

6.Java动态绑定机制

当调用对象的方法时,该方法会与该对象的内存地址/运行类型绑定。

当调用对象的属性时,不存在动态绑定机制。

public class Test {
    public static void main(String[] args) {
        A a = new B();//A为编译类型,B为运行类型
        System.out.println(a.sum());
        //B类中sum()没注释前 结果为 40 注释后结果为 30
        //注释后会调用A类的sum方法但因为动态绑定机制sum中的getI方法调用的是B中的
        System.out.println(a.sum1());
        //B类中sum()没注释前 结果为 30 注释后结果为 20
        //调用A类的sum1,i由于是调用对象的属性,不存在动态绑定机制,哪里声明就调用哪的i=10
    }
}
public class A {
    public int i = 10;
    public int sum() {
        return getI() + 10;
    }
    public int sum1() {
        return i + 10;
    }
    public int getI() {
        return i;
    }
}
public class B extends A {
    public int i = 20;
//    public int sum() {
//        return i + 20;
//    }
//    public int sum1() {
//        return i + 10;
//    }
    public int getI() {
        return i;
    }
}

7.多态数组多态参数

多态数组

数组的定义类型为父类类型,里面保存的实际元素类型为子类类型和父类类型。

多态参数

方法定义的形参类型为父类类型,实际类型允许为子类类型。

示例:父类为Employee,子类为Worker和Manage

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        Employee employee = new Employee("Bob",3000);
        Employee[] employee1 = new  Employee[5];//多态数组 父类定义
        Worker worker = new Worker("Tom",5000);
        Worker worker1 = new Worker("Kit",6000);
        Manager manager = new Manager("Smith",12000,100000);
        Manager manager1 = new Manager("Sab",15000,110000);
        employee1[0]=worker;//可放子类
        employee1[1]=worker1;
        employee1[2]=manager;
        employee1[3]=manager1;
        employee1[4]=employee;//也可放本类
        test.showEmpAnnal(worker);//多态参数 实参可为子类
        test.showEmpAnnal(manager);
        test.testwork(employee1);
    }
    public void showEmpAnnal(Employee e){//多态参数 形参为父类
        System.out.println(e.getName()+" 的年薪为:"+e.getAnnual());
    }
    public void testwork(Employee e[]){
        for (int i = 0; i <5 ; i++) {
            if(e[i] instanceof Worker){
                ((Worker) e[i]).work();//向下转型
            }else if(e[i] instanceof Manager){
                ((Manager) e[i]).manage();
            }else {
                System.out.println("员工 "+e[i].getName()+" 正在摸鱼!");
            }
        }
    }
}

到此这篇关于Java轻松掌握面向对象的三大特性封装与继承和多态的文章就介绍到这了,更多相关Java封装 继承 多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java封装、继承、多态三大特征的理解

    首先先简单的说一下其3大特性的定义: 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员.封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员.封装的基本要求是: 把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的

  • 新手初学Java继承、封装与多态

    目录 面向对象的三大核心特性 封装 继承 单继承 继承的优缺点 super关键字 super调用父类构造方法 super访问父类成员 super和this的区别 多态 instanceof关键字 方法重载 方法重写 抽象类 接口 定义接口 实现接口 总结 面向对象的三大核心特性 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率.面向对象程序设计有以下优点. 可重用性:代码重复使用,减少代码量,提高开发效率.下面介绍的面向对象的三大核心特性(

  • 详解java封装继承多态

    面向对象编程(Object Oriented Programming)有三大特性:封装.继承.多态.在这里,和大家一起加深对三者的理解. 封装 封装可以拆开理解,装,是把数据和方法放进了类里:封,把装进去的数据和成员方法加上访问权限.对于外界,内部细节是透明的,暴露给外面的是它的访问方法. 继承 继承,是为了重用父类代码.两个类若具有is a的关系就可以用extends.另外,继承也为实现多态做了铺垫. 多态 程序中定义的引用变量(java有两大数据类型,内部数据类型和引用数据类型)所指向的具体

  • 详解Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开发者,封装就得我们自己来干. 那么作为开发者,我们应该如何去封装呢?其实你应该反过来问,他们应该如何去使用,这样一想会简单很多,作为使用者,自然是希望越简单越好,也就是说,一些复杂的东西,我们不应该让使用者去操作,那也就是说我们应该把复杂的,以及不必要的参数给它封死,不让使用者去操作. 为什么不让使用者去操作

  • Java面向对象基础知识之封装,继承,多态和抽象

    目录 一.封装 二.继承 三.多态 四.抽象 总结 一.封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的.增加安全性 public class Person { private String name; private int gender; private int age; public String

  • JAVA回顾:封装,继承,多态

    目录 知识点回顾 封装 继承 super注意点: Vs this: 前提: 构造方法 多态 总结 知识点回顾 封装 封装(有时称为数据隐藏)是与对象有关的一个重要概念.从形式上来看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.对象中的数据称为实例域,操作数据的过程称为方法.对于每个特定的类实例(对象)都有一组特定的实例域值.这些值的集合就是这个对象的当前状态.无论何时,只要向对象发送一个消息,它的状态就有可能改变. 实现封装的关键在于绝对不能让类中的方法直接地访问

  • 浅谈Java封装、继承、多态特性

    目录 1.封装 2.继承 3.多态 4.上代码,效果运行放在最后 1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量和方法),保护成员不被其他别的类来使用,如果需要被其他类来使用,那么需要提供对应的操作:a.提供get变量名()方法,用于获取成员变量的值 b.提供set变量名(参数),用于设置成员变量的值,同样也和get方法一样,都是用public

  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    目录 类和对象的使用(面向对象思想落地的实现): 子类对象实例化的全过程 1.从结果上看:(继承性) 2.从过程上来看: 1.封装性 2.继承性 继承性的好处: 3.多态性 虚拟方法调用 4.抽象性 1.抽象类的特点: 2.天生的父类:抽象类 3.抽象方法 总结 创建类的对象 = 类的实例化 = 实例化类 类和对象的使用(面向对象思想落地的实现): 1.创建类,设计类的成员 2.创建类的对象 3.通过"对象.属性"或"对象.方法"调用对象的结构 如果创建了一个类的多

  • Java中的封装、继承和多态,你真的都懂了吗

    封装 所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了,我们现在来使用一下这个类. 当我们使用的时候编译器给出了下面这样的报错. 告诉我们说是private访问控制,那么这是什么意思呢?我们来看看另外一张图,那么这张图代表这什么呢?在看这张图之前,我们先来看看四者都提到的包,那么包又是什么呢,包可以简单理解为一个文件夹,把类放到放到包里面,也就相当于是专门的文件夹里面,这不是我们说的重点

  • Java轻松掌握面向对象的三大特性封装与继承和多态

    目录 1.封装 1.介绍 2.封装的理解和好处 3.封装的实现步骤 2.继承 1.介绍 2.继承的基本语法 3.继承的使用细节 3.super关键字 1.基本介绍 2.基本语法 3.细节与好处 4.super与this的比较 4.方法重写 1.基本介绍 2.注意事项与使用细节 3.重载与重写的比较 3.多态 1.基本介绍 2.具体体现 1.方法的多态 2.对象的多态(重点) 3.多态注意事项和细节讨论 1.多态的前提 2.属性 3.instance of 4.多态的向上转型 5.多态的向下转型

  • Python面向对象的三大特性封装、继承、多态

    Python是一门面向对象的语言.面向对象都有三大特性:封装.继承.多态. 下面分别来说说这三大特性: 1.封装 隐藏对象的属性和实现细节,仅对外提供公共访问方式.在python中用双下划线开头的方式将属性设置成私有的 . 好处: 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性. 2.继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 即一个派生类继承基类的字段和方法.继承也允许把一个派

  • Python面向对象三大特征 封装、继承、多态

    目录 1.封装 1.1 私有属性和私有方法 2.继承 2.1 方法的重写 2.2 在子类方法中调用父类方法 2.3 多继承 2.4 新式类和经典类 3.多态 1.封装 封装: 根据 职责 将 属性 和 方法 封装到一个 抽象的类 中将数据(属性)和行为(方法)包装到类对象中.在方法内部对属性进行操作,在类对象的外部调用方法.这样无需关心方法 内部的具体实现,从而隔离了复杂度 封装是面向对象编程的一大特点 面向对象编程的第一步.将属性和方法封装到一个抽象的类中 外界使用类创建对象,然后让对象调用方

  • Java三大特性-封装知识小结

    最近有个朋友说想要说最近在学java,他对面向对象的编程语言的时候还是有些不明白,为了帮他能更快地"转型",我就写了这篇文章.因为从上层建筑层面而言.所有的面向对象编程语言的思路都是差不多的,而这三大特性,则是思路中的支柱点,接下来我就重点讲解了一下java三大特性. 面向对象的编程语言,拥有三大特性,分别是:"封装","继承","多态". 封装 在面向对象编程中,封装封装(encapsulation)从字面上来理解就是包装的

  • java面向对象的三大特性之一继承用法实例分析

    本文实例讲述了java面向对象的三大特性之一继承用法.分享给大家供大家参考,具体如下: Java用extends关键字表示这种继承关系. Java的继承只允许单继承,即一个类只能有一个父类. 代码: 工程师类: package com.jredu.oopch02; /** * 工程师类 * @author Administrator * */ public class Engineer { //共有的属性和方法 //子类可以继承 protected int id; protected Strin

  • C# 面向对象三大特性:封装、继承、多态

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分. 1.封装 每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码.使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些

  • Java超详细讲解三大特性之一的继承

    目录 继承的概念 方法的重写 super关键字的使用 super调用构造器 总结 继承的概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量. 继承性的好处: 减少代码的重复 提高代码复用性 便于功能拓展 继承性的格式:class A extends B{} A:子类,派生类,subclass,B: 父类

  • Python面向对象程序设计类的封装与继承用法示例

    本文实例讲述了Python面向对象程序设计类的封装与继承用法.分享给大家供大家参考,具体如下: 访问限制(封装) 1.概念 面向对象语言的三大特征:封装, 继承, 多态. 广义的封装: 类和函数的定义本身就是封装的体现. 狭义的封装:一个类的某些属性,不希望外界直接访问,而是把这个属性私有化[只有当前类持有],然后暴露给外界一个访问的方法. 封装的本质:就是属性私有化的过程. 封装的好处:提供了数据的复用性,保证了数据的安全性. 举例:插排 2.使用 class Person(object):

随机推荐