面向对象---封装与继承 this super关键字

面向对象 之

封装与继承

名词解释

  • 作用域方面
      1. 成员变量
        成员变量可以被修饰符修饰
      1. 局部变量
        局部变量不能被修饰符修饰
  • 功能方面
      1. 实例变量
      1. 静态变量
        都属于成员变量

为什么要使用封装

  • 案例中的代码有什么缺陷?
    Penguin p=new Penguin();
    p.health=-1000;
    //属性随意访问,不合理的赋值
  • 如何解决上面设计的缺陷
    使用封装

什么是封装

面向对象三大特征之一 封装
封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,
而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的两个大致原则
把所有的属性藏起来
如何实现封装
  1. 修改属性的可见性 //设为private,防止错误的修改
  2. 创建公有的getter/setter方法 //用于属性的读写
  3. 在getter/setter方法中加入属性控制语句 //对属性值的合法性进行判断
封装的好处
  • 便于使用者正确使用系统,防止错误修改属性
  • 有助于系统之间的松耦合,提高系统独立性 松耦合:增强程序的可扩展性
  • 提高软件的可重用性
  • 降低了构建大型系统的风险

为什么需要包

  • Windows树形文件系统
    • 文档分门别类,易于查找和管理
    • 使用目录解决文件同名冲突问题
  • 如何存放两个同名的类而不冲突
使用包      package
包对应Java源文件的目录结构

包的作用

  • 1.允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
  • 2.防止命名冲突区分名字相同的类
  • 3.有助于实施访问权限控制

如何创建包

    package cn.jbit.inherit;//声明包
    public class School{
        ... ...
    }

作为Java源代码第一条语句
用package声明包,以分号结尾

包命名规范

  • 包名由小写字母组成,不能以圆点开头或结尾
    package mypackage;
  • 包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
    package net.javagroup.mypackage;
  • 包名后续部分依不同机构内部的规范不同而不同
    package net.javagroup.research.powerproject;
    //powerproject 部门名.项目名

用MyEclipse创建包

  • JDK提供基本包
    • java.lang: 虚拟机自动引入
    • java.util: 提供一些实用类
    • java.io: 输入、输出
  • 使用MyEclipse创建包的两种方法
    • 分别创建包和类
    • 创建类的过程中创建类所在的包

如何导入包

  • 为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类
    import 包名.类名;
    import java.util.*; //导入java.util包中所有类
    import cn.jtest.classandobject.School; //导入指定包中指定类
    1.系统包:java.util
    2.自定义包:cn.jtest.classandobject
    *:指包中的所有类
    School:指包中的School类

使用包的注意事项

  • 一个类同时引用了两个来自不同包的同名类
    • 必须通过完整类名来区分
  • 每个包都是独立的,顶层包不会包含子包的类
  • package和import的顺序是固定的
    • package必须位于第一行(忽略注释行)
    • 只允许有一个package语句
    • 其次是import
    • 接着是类的声明

小结

  • School类位于cn.jbit.classandobject包中,Hello类位于demo包中,下面程序空缺部分需要填入代码吗?如果需要,是什么?
    package cn.jbit.classandobject;

    public class School{
        public void showMessage(){
            ......
        }
    }
    package demo;
    import cn.jbit.classandobject.*;

    public class Hello{
        public static void main(String[] args){
            School center=new School();
            center.showMessage();
        }
    }

访问权限控制

  • 回顾

    • 属性隐藏
    • 包机制
  • 访问权限控制

    • 类的访问控制
    • 类成员的访问控制
  • private -私有,标记为私有的内容无法被除当前类以外的任何位置访问

  • 什么都不写 -默认,默认情况下,只能被类本身合同包中的其他类访问

  • protected -受保护,标记为受保护的内容可以能被类本身和同包中的其他类访问,也可以被子类访问

  • public -公共,标记为公共的内容,允许在任何地方被访问

类的访问修饰

  • 类的访问修饰符
    • public修饰符:公有访问级别
    • 默认修饰符:包级私有访问级别

类成员的访问修饰

修饰符\作用域同一个类中同一个包中子类中任何地方
private可以不可以不可以不可以
默认修饰符可以可以不可以不可以
protected可以可以可以不可以
public可以可以可以可以

static修饰符

  • static可以用来修饰
    • 成员变量
      • 静态方法,可以直接通过类名访问
    • 成员方法
      • 静态方法,可以直接通过类名访问
    • 代码块
      • 静态代码块,当Java虚拟机加载类时,就会执行该代码块

static代码块

  • JVM加载类时,加载静态代码块
    • 如果有多个静态块,按顺序加载
    • 每个静态代码块只会被执行一次
    public class StaticTest{
        static int num=100;
        static{
            num+=100;
            System.out.println(num);
        }
        static{
            num+=100;
            System.out.println(num);
        }
    }
StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();
System.out.println(StaticTest.num);

static变量

  • 类的成员变量包括
    • 类变量(静态变量)
      • 被static修饰的变量
      • 在内存中只有一个拷贝
      • 类内部,可在任何方法内直接访问静态变量
      • 其他类中,可以直接通过类名访问
    • 实例变量
      • 没有被static修饰的变量
      • 每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响

static变量使用

  • 如下代码的输出结果是什么?
    public class StaticTest{
        static int num;
        public static void main(String[] args){
            num++;
            StaticTest st1=new StaticTest();
            st1.num++;
            StaticTest st2=new StaticTest();
            st2.num++;
            StaticTest.num++;
            System.out.println(num); 

            //4

        }
    }
public class Student {

    static String name;//静态变量
    int id;//实例变量

    /**
     * 静态方法
     */
    public static void m1(){
       // System.out.println(id); 静态方法里不能用本类的实例变量
        // m2(); 静态方法不能调用本类的实例方法
    }

    /**
     * 实例方法
     */
    public void m2(){
        System.out.println(name);
        m1();
    }


}

static变量的作用
(1)能被类的所有实例共享,可作为实例之间进行交流的共享数据
(2)如果类的所有实例都包含一个相同的常量属性,
    可把这个属性定义为静态常量类型,从而节省内存空间
static方法
  • 静态方法:可以直接通过类名访问
    • 静态方法中不能使用this和super
    • 不能直接访问所属类的实例变量和实例方法
    • 可直接访问类的静态变量和静态方法
  • 实例方法:通过实例访问
    • 可直接访问所属类的静态变量、静态方法、实例变量和实例方法
  • 静态方法必须被实现
main()就是最常用的静态方法

继承

在这里插入图片描述

  • 使用继承修改后
    在这里插入图片描述

如何使用继承

  • 使用继承
    • 编写父类
    [访问修饰符]class Pet{
        //公共的属性和方法
    }
    
    • 编写子类,继承父类
    [访问修饰符]class Dog extends Pet{
        //子类特有的属性和方法
    }
    
    继承是Java中实现代码重用的重要手段之一.Java中只支持单根继承,即一个类只能有一个直接父类

理解继承

  • 子类访问父类成员
    • 访问父类构造方法
    super();
    super(name);
    
    • 访问父类属性
    super.name;
    
    • 访问父类方法
    super.print();
    
(1) 使用super关键字,supur代表父类对象
(2) 在子类构造方法中调用且必须是第一句
(3) 不可以访问父类中定义为private的属性和方法

小结

  • super关键字来访问父类的成员
    • super只能出现在子类的方法和构造方法中
    • super调用构造方法时,只能是第一句
    • super不能访问父类的private成员

继承条件下构造方法的调用规则

  • 子类构造方法没有通过super显示调用父类的有参构造方法,也没通过this显示调用自身其他构造方法
    • 系统默认调用父类的无参构造方法
  • 子类构造方法通过super显示调用父类的有参构造方法
    • 执行父类相应构造方法,而不执行父类无参构造方法
  • 子类构造方法通过this显示调用自身的其他构造方法,在相应构造方法中应用以上两条规则

理解继承

子类继承父类的什么?
  • 继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包内
  • 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包内
子类可以继承父类的所有资源吗?
  • 不能被继承的父类成员
    • private成员
    • 子类与父类不在同包,使用默认访问权限的成员
    • 构造方法

小结

  • 访问修饰符protected
    • 可以修饰属性和方法
    • 本类、同包、子类可以访问

使用继承

何时使用继承?
  • 继承与真是世界类似
    • 只要说"猫是哺乳动物",猫的很多属性、行为就不言而明了
    • 藏獒是一种狗
    符合 is-a 关系的设计使用继承
    
  • 继承是代码重用的一种方式
将子类共有的属性和行为放到父类中
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值