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

目录
  • 类和对象的使用(面向对象思想落地的实现):
    • 子类对象实例化的全过程
      • 1.从结果上看:(继承性)
      • 2.从过程上来看:
  • 1.封装性
  • 2.继承性
    • 继承性的好处:
  • 3.多态性
    • 虚拟方法调用
  • 4.抽象性
    • 1.抽象类的特点:
    • 2.天生的父类:抽象类
    • 3.抽象方法
  • 总结

创建类的对象 = 类的实例化 = 实例化类

类和对象的使用(面向对象思想落地的实现):

1.创建类,设计类的成员

2.创建类的对象

3.通过“对象.属性”或“对象.方法”调用对象的结构

如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)

意味着,如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。

子类对象实例化的全过程

1.从结果上看:(继承性)

  • 子类继承父类以后,就获取了父类中声明的属性和方法。
  • 创建子类的对象,在对空间中,就会加载所有父类中声明的属性。

2.从过程上来看:

当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器。直到调用了java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用。

明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象。

匿名对象

1. 理解:我们创建的对象,没有显式的赋给一个变量名,即为匿名对象

class Phone{
    Phone p = new phone();//普通方式创建对象
    p.sendEmail();
    new Phone().sendEmail();//匿名对象只能直接调用方法
    new Phone().price = 1999;//匿名对象调用属性
}

2.特征:匿名对象只能使用一次

3.匿名对象在开发中的使用

class Phone{
    public static void main(String[] args){
        PhoneMall mall = new PhoneMall();
        //匿名对象的使用
        mall.show(new Phone());
    }
}
class PhoneMall{
    public void show(Phone phone){
        phone.sendEmail();
    }
}

1.封装性

封装性的体现:

我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置属性

拓展:封装性的体现:A. 如上 B.不对外暴露的私有的方法 C.单例模式.....

封装性的体现,需要权限修饰符来配合。

1. Java规定的4中权限(从小到大排列):private、缺省、protected、public

2. 4种权限修饰符可以用来修饰类的内部结构:属性、方法、构造器、内部类

3. 修饰类的话,只能使用:缺省、public; public类可以在任意地方被访问。

default类只可以被同一个包内部的类访问。

2.继承性

继承性的格式:class A extends B{}

A:子类、派生类、subclass

B:父类、超类、基类、superclass

体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。

特别的,父类中声明为private的属性和方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是由于封装性的影响,使得子类不能直接调用父类的结构而已。

子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的扩展。子类和父类的关系,不同于子集和集合的关系。

Java中关于继承性的规定:

1.一个类可以被多个子类继承。

2.Java中类的单继承性,一个类只能有一个父类

3.子父类是相对的概念。

4.之类直接继承的父类,称为:直接父类;间接继承的父类称为:间接父类

5.子类继承父类以后,就获取了直接父类以及所有间接父类中生命的属性和方法

----------

1.如果我们没有显示的声明一个列的父类的话,则此类继承于java.lang.Object类

2.所有的java类(除java.lang.Object类之外)都直接或间接的继承于java.lang.Object类

3.意味着,所有的java类具有java.lang.Object类声明的功能。

继承性的好处:

减少了代码的冗余,提高了代码的复用性便于功能的扩展;为之后多态性的使用,提供了前提。

在使用子类实例时,如果我们想要使用某些父类的属性或方法,可以借助构造器和封装方法;如下:

public class Father{
    //父类中的私有的属性
    private double ownMoney = 2000;//私房钱
    //父类中的受保护的属性
    protected double money = 5000;
    //父类中的公开属性
    public String name = "老张";
}
public class Son extends Father{
    //子类中的独有属性
    ...
    //使用构造器为属性赋值
    public Son(String name,double money){
        super.name = name;
        super.money = money;
    }
    //使用封装方法操作父类中的属性
    public void setMoney(double money){
        super.money = money;
    }
    public double getMoney(){
    return super.money;
    }
}
public class Test{
    public static void main(String[] args){
        //在test包中的Test类中创建Son实例
        Son son = new Son("小张",3000);//为父类继承而来的属性赋值
        //以下代码编译通过
        double money = son.getMoney();
        System.out.println(money);
        son.setMoney(money - 500);
    }
}

从以上的例子看到:测试类对于字符类来说是一个处在不同包中的完全无关的类,在调用时会被权限修饰符所限制,所以这里明确一下:权限修饰符是根据类的搜在路径 与列之间的结构关系惊醒限定的,不是说在任意一个地方使用子类实例都能调用出父类中的属性和方法。

3.多态性

1.理解多态性:可以理解为一个事物的多种形态。

2.何为多态性:

  • 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)

3.多态的使用:虚拟方法调用

  • 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。

总结:编译,看左边;运行,看右边。

4.多态性的使用前提:A.存在子父类继承关系 B.子类重写父类的方法 C.父类引用指向子类对象

5.对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)

5.1 若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中,编译看左边,运行看右边。

5.2 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量,编译运行都看左边。

6.多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----->虚拟方法调用

虚拟方法调用

正常的方法调用:

Person e = new Person();
e.getInfo();
Student e = new Student();
e.getInfo();

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

子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法,这样的方法调用在编译期是无法确定的。

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

编译时类型和运行时类型

编译时e为Person类型,而方法的调用时在运行时确定的,所以调用的是Student类的getInfo()方法。------动态绑定

public class PersonTest{
    public static void main(String[] args){
        Person p2 = new Man();
        Person p3 = new Woman();
        p2.name = "Tom";
        //不能调用子类所特有的方法、属性;编译时,p2是Person类型。
//      p2.earnMoney();//earnMoney()是子类Man()的方法
    }
}

有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用。

如何才能调用子类特有的属性和方法?

答:向下转型,使用强制类型转换符。

Man m1 = (Man)p2;
m1.earnMoney();
//使用强转时,可能出现ClassCastException的异常
Woman w1 = (Woman)p2;//p2是Man;两者并列关系
w1.goShopping();

解决这个问题的办法是先使用关键字(instanceof)判断一下!!!!! (会在下一篇博客关键字中介绍)

4.抽象性

背景:有两个在逻辑上看似相关的类,我们想要把他们联系起来,因为这样做可以提高效率,例如:矩形、圆形,都可以具有周长和面积两个方法,但是计算的方式完全不同,矩形和圆形之间肯定不能构成子父类的关系,那么只能是同时去继承一个父类。这时,就引出了抽象的概念。

1.抽象类的特点:

抽象类的本质依然是一个类,所以具备着一个普通类的所有功能,包括构造方法等的定义,总结一下,抽象类具有以下的几个特点:

  • A. 抽象类由abstract修饰
  • B. 抽象类中允许出现抽象方法
  • C.抽象了不能通过构造器直接实例化
  • D.可以在抽象类中定义普通方法供子类继承。
public abstract class Figure{
    //定义计算周长的抽象方法:getC()
    //抽象方法,不能有方法主体
    public abstract double getC();
}

2.天生的父类:抽象类

2.1 抽象类不能直接实例化(编译无法通过),是天生的父类

2.2 如果一个类继承了抽象类,那么必须重写父类中的抽象方法

2.3 如果抽象类中定义了构造方法,可以被子类调用或在实例化子类对象时执行

2.4 如果抽象类的子类依然是抽象类(需要用abstract声明),可以不重写抽象方法,将重写操作留给下一级子类

2.5 抽象类不能使用final关键字修饰,因为final 修饰的类是无法被继承

2.6 抽象类的匿名子类

public class PersonTest{
    public static void main(String[] args){
        method(new Student());//匿名对象
        Worker worker = new Worker();
        method1(worker);//非匿名的类非匿名的对象
        method1(new Worker());//非匿名的类匿名的对象
        //创建了一匿名子类的对象:p
        Person p = new Person(){
            @Override
            public void eat(){
            }
        }
        //创建匿名子类的匿名对象
        method1(new Person()){
            @Override
            public void eat(){
            }
        }
    }
}
class Worker extends Person{
}

3.抽象方法

3.1 抽象类中的抽象方法只是声明,不包含方法体

3.2 抽象方法不能用private修饰,因为抽象方法必须被子类实现(重写),而private 权限对于子类来说是不能访问的

3.3 一个类继承了一个抽象类,那么它必须全部重写抽象类中的抽象方法,当然也可以不全部重写,如果不重写全部抽 象方法则这个子类也必须是抽象类

3.4 构造方法,类方法(static修饰的方法)不能声明为抽象方法

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

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

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

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

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

  • Java基础-封装和继承

    目录 一. 封装 1.1 封装的目的 1.2 封装的好处 1.3 封装的步骤 1.4 封装的例子 1.5 小结 二. 继承 2.1 继承的介绍 2.2 生活中的继承 2.3 继承的好处 2.4 继承的格式 2.5 继承的demo 2.6 子类不能继承的内容 2.6.1 super 与 this 关键字 2.6.2 构造器不能被继承 2.6.3 final修饰的类不能被继承 2.7 方法重写 2.7.1 介绍 2.7.2 使用场景与案例 2.7.2 @Override重写注解 2.7.3 注意事项

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

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

  • 详解java封装继承多态

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

  • Java面向对象程序设计:继承,多态用法实例分析

    本文实例讲述了Java面向对象程序设计:继承,多态用法.分享给大家供大家参考,具体如下: 本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类(父类/超类/基类)即可.[比如,泰迪狗类也是狗类,狗的属性,泰迪狗也应该是有的,那么泰迪狗类在定义的时候就不必要添加那些与狗类重复的属性了,而是直接继承狗类即可.在多个狗类的子类(泰迪狗,二哈,柴犬)的时候,直

  • Java面向对象的封装特征深度解析

    目录 面向对象三大特征 封装 private关键字--实现类封装 访问器方法和更改器方法 包--类的集合 导入包 从人的角度理解包 不加访问权限--实现包封装 总结 在上一篇文章中,我们了解了面向对象的基础内容,这一篇将会更加深入地了解面向对象的特征. 面向对象三大特征 面向对象语言有三大特征: 封装 继承 多态 封装 对一个类实现封装,意味着限制其它类对该类数据的访问. 简单来讲,封装就是隐藏数据,就是保护对象的数据.对象,听起来总是那么地抽象,为了更好地理解封装,我将对象具体指向人,从人的角

  • Java面向对象关键字extends继承的深入讲解

    目录 一. 问题引出 二.继承extends 2.1 继承的用法 2.2 基本语法 2.3继承的好处 2.4继承性 总结 一. 问题引出 面向对象的编程思想使得代码中创建的类更加具体,他们都有各自的属性,方法.有的时候一些客观事物之前存在一些联系,那么他们在代码中的具体类也存在一些联系. 例如:设计一个动物类 public class Animal { public String name; public int age; public Animal(String name) { this.na

  • Java 面向对象和封装全面梳理总结

    关于面向对象和封装的个人理解 类和对象 类:对事物的一种描述(具有共同属性和行为的事物的抽象),例如手机,属性:品牌价格,行为:玩游戏,刷vx: 对象:客观存在(在java中体现就是mian方法里面用类定义一个对象,然后用对象去调用方法或者调用成员变量) 二者关系:类为属性行为抽象,对象则为实体. 对象内存图理解:堆内存开辟空间,成员变量出现 并产生默认初始化值,将对象地址值记录以便于通过对象名调用成员变量. 成员变量和局部变量的区别:类中位置不同,内存中位置不同,生命周期不同,初始化值不同(成

  • JavaScript使用prototype原型实现的封装继承多态示例

    本文实例讲述了JavaScript使用prototype原型实现的封装继承多态.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&

  • Java面向对象之类的继承介绍

    目录 继承的作用 如果没有继承机制是怎么样的? 使用继承机制后的示例? 类的继承是什么? 子类和父类的继承机制 Java单继承 Java继承的顶级父类:Object 对象的类型转换 对象向上转型 对象向下转型 总结 继承的作用 如果没有继承机制是怎么样的? 有以下两个类,分别是Student.Teacher,它们的实现类如下: /** * 老师类 封装了姓名.年龄 * * @author Administrator * */ public class Teacher { private Stri

  • 理解Java面向对象编程设计

    目录 1 前言 2 结构化程序设计 3 面向对象编程设计 4 码农洞见 4.1 两种编程范式之间的区别 4.2 两种编程范式之间的联系 1 前言 计算机革命的起源来自机器.编程语言就像是那台机器.它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分.语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作.编程语言就是创建应用程序的思想结构. 面向对象编程(Object-Oriented Programming OOP)是一种编程思维方式和编码架构. 2 结构化程序设计 结

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

随机推荐