栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

09. Java基础&面向对象编程三大特性(封装、继承、多态)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

09. Java基础&面向对象编程三大特性(封装、继承、多态)

文章目录
    • 1.封装
      • 1.1封装概述
      • 1.2 封装思想
      • 1.3 封装时权限控制符区别
      • 1.4 示范代码
    • 2.继承
      • 2.1 继承概述
      • 2.2 继承的优缺点
      • 2.3 继承的格式
      • 2.4 构造方法/构造器
      • 2.5 super和this
    • 3.多态
      • 3.1 多态概述
      • 3.2多态的好处和弊端
      • 3.3 多态中的转型


1.封装 1.1封装概述

​ 将 方法 和 属性 写到同一个类中,并将属性 私有化,生成 get set方法,外部访问属性需要通过get和set方法,内部可以直接访问属性,这样的一个类我们认为它完成了封装。

​ 封装可以隐藏实现细节,使得代码模块化;对于面向编程可以解释为:把客观事务封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

1.2 封装思想
  1. 封装概述 是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
  2. 封装原则 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法
  3. 封装好处 通过方法来控制成员变量的操作,提高了代码的安全性 把代码用方法进行封装,提高了代码的复用性
1.3 封装时权限控制符区别
privatedefaultprotectedpublic
同一类中
同一包中
子类
全局范围
1.4 示范代码
public class Demo{
    //对属性的封装
    private String name;
    ...
       
     public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
}

注:关于this的介绍可以观看 06. Java基础&面向对象

2.继承 2.1 继承概述

​ 子类继承父类,子类实例可以调用父类除private修饰以外的所有属性和方法,一个子类只能继承一个父类,但是可以多重继承,一个父类可以拥有多个子类。

​ 继承描述的是事物之间的所属关系,这种关系是:is-a的关系。例如:兔子属于食草动物,食草动物属于动物。由此可得,父类更通用,子类更具体。我们通过继承可以使多种事物之间形成一种关系体系。

定义:

​ 继承:子类继承父类的 属性和 行为 ,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

2.2 继承的优缺点

优点:

  1. 提高了代码的复用性;
  2. 提高了代码的可维护性;
  3. 让类与类之间产生了关系,是多态的前提。

缺点:

  1. 类的耦合度增强了
2.3 继承的格式

通过 extends关键字,可以声明一个子类继承另一个父类,定义格式如下:

class 父类 { 
    ... 
}

class 子类 extends 父类 { 
    ... 
}

示范代码:

class Empoyee{
    String name;
    public void work(){
        System.out.println("工作");
    }
}

//定义教师类 继承 员工类
class Teacher extends Employee{
    public void teach(){
        System.out.println(name+"教书");
    }
}

//测试类
public class Demo{
    public static void main(String[] args){
        //创建教师类
        Teacher t=new Teacher();
        t.name="张三";
        t.teach();  //输出 “张三教书”
        
        t.work(); //输出 "工作"
    }
}
2.4 构造方法/构造器

​ 除了那些private的外还有一样是子类继承不了的—构造器。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法我们使用super()即可。

​ 构建过程是从父类”向外“扩散的,就是从父类开始向子类一级一级的完成构建。Java开发中:编译器会默认给子类调用父类的构造器。

​ 默认调用父类的构造器有前提:父类有默认构造器。如果没有,必须用super() 来调用父类构造器。否则编译报错。

构造方法

  1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
  2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构 造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。

示范代码:

class Fu { 
    private int n;
    Fu(){ 
        System.out.println("Fu()");
    } 
}

class Zi extends Fu { 
    Zi(){ 
        // super(),调用父类构造方法 
        super(); 
        System.out.println("Zi()");
    } 
}
public class ExtendsDemo07{ 
    public static void main (String args[]){ 
        Zi zi = new Zi();
    } 
}
输出结果: 
    Fu()
    Zi()
2.5 super和this

父类空间优先与子类对象产生

​ 在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成员。代码体现在子类的构造方法调用时,一定先调用父类的构造方法。

super和this的含义

  • super:代表父类存储空间标识(父类的引用)
  • this:代表当前对象的引用(谁调用代表谁)

super和this的用法

  1. 访问成员
this.成员变量 ‐‐ 本类的 
super.成员变量 ‐‐ 父类的 
    
this.成员方法名() ‐‐ 本类的 
super.成员方法名() ‐‐ 父类的
  1. 访问构造方法
this(...) ‐‐ 本类的构造方法 
super(...) ‐‐ 父类的构造方法
3.多态 3.1 多态概述

​ 父类的引用指向子类的实例,多个子类继承同一个父类实现了这些类共通的方法,每一个子类实现的结果都不同。

多态的前提

  • 要有继承或实现关系(继承是多态的基础,没有继承就没有多态).
  • 要有方法重写(多态下调用子类重写的方法).
  • 要有父类引用指向子类对象(子类到父类的类型转换).

重载(overload)和重写(override)是实现多态的两种主要方式

3.2多态的好处和弊端
  • 好处

提高程序的扩展性,定义方法的时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作。

  • 弊端

不能使用子类的特有成员

3.3 多态中的转型
  • 向上转型

父类引用指向子类对象就是向上转型

  • 向下转型

格式:子类型 对象名=(子类型)父类引用;

  • 代码演示

    • 动物类
    public class Animal {
        public void eat() { 
            System.out.println("动物吃东西");
        } 
    }
    
    • 猫类
    public class Cat extends Animal { 
        @Override 
        public void eat() { 
            System.out.println("猫吃鱼"); 
        }
        
        public void playGame() { 
            System.out.println("猫捉迷藏"); 
        } 
    }
    
    • 测试类
    public class AnimalDemo {
        public static void main(String[] args) { 
            //多态 
            //向上转型 
            Animal a = new Cat(); 
            a.eat(); 
            // a.playGame();
                
           //向下转型 
            Cat c = (Cat)a; 
            c.eat(); 
           c.playGame();
        } 
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号