Java面向对象(三)

Javase面向对象

package包

  • 平常我们写的都是java代码,运行时将java代码编译成class文件
  • 最终执行的是class文件
  • 我们在Eclipse中是看不到bin目录的,因为bin目录中都是class字节码文件,都是系统自动生成的
  • 如果把这个路径暴露给大家,大家只会对他造成破坏
  • Eclipse默认在我们保存文件的时候将java代码编译成class字节码
  • 相同路径下不能创建同名的类
    • 就是在相同的路径下创建了同名类
    • 类名有的时候有可能相同,我们只要尽量做到“不相同路径下”就可以杜绝这个问题
  • 类与类之间存在着相互的引用
    • Teacher cannot be resolved to a type
    • 如果我们要是用的类和当前类不在一个文件目录中,就会出现上面的问题
    • aa.bb.cc.Teacher teacher = new aa.bb.cc.Teacher();
      • 直接在类的前面添加上包名
    • import c.d.e.f.g.User;
      • 将指定包下面的类导入到当前类中,可以在当前类中直接使用
      • 特别要注意同一个项目中的同名类,如果出现同名类在一个类中引用,需要在第二个类上写全包名+类名
  • 包命名的规范
    • 域名 com 全球唯一 cn 全中国唯一 org机构 edu 学校 gov*
    • http://news.baidu.com/
    • 域名解析都是从大到下解析的(com–>baidu–>news)
    • 域名全球唯一,所以各个公司为了防止代码冲突
    • 使用公司的域名作为报名的前缀,而且使用域名的倒写
    • 域名要全部小写
  • 学习完包之后我们就不担心自己写的类和别人的类冲突的问题
    • 自己写类名和别人写的类名还会一致吗?

封装

  • 需要让用户知道的暴露出来,不需要让用户了解的全部隐藏起来。这就是封装,白话: “ 该露的露,该藏
    的藏”。

  • 程序设计的理念就是高内聚 低耦合

    • 高内聚:将程序运行所需的属性或者方法尽量都放在一个类中
    • 低耦合:程序运行期间尽量不要依赖于别人的方法或者属性
  • 级别

    • public:公开的
      • 所有的地方都可以调用到这个属性或者方法
    • protected 受保护的
      • 当前类中可以使用
      • 同一个包中的类可以使用
      • 子类中可以使用
    • default 默认的
      • 当前类中可以使用
      • 同一个包中可以使用
    • private 私有的
      • 当前类中可以使用
        -Java面向对象(三)
  • 封装这四种级别就为我们刚才讲的提供了实现的方式

    • 我们可以把要其他人调用的暴露出来
    • 将自己隐私的属性方法隐藏起来
    • 我们还可以根据调用者不同选择不同的封装级别

JavaBean

  • 将来有可能有很多的名字
    • vo dto jopo po
  • 但是他们的写法是一致的
    • 所有的属性私有
    • 给私有的属性设置 get和set方法,方法的名字格式固定(get/set + 属性名首字母大写)
      • alt shift s
      • r
      • alt a
      • alt r
    • 空构造器
      • alt / -->回车

继承

  • 通过继承可以获取父类所有的属性和方法
    • 即使父类的属性是private的,也会被继承,但是受封装影响不能被使用
    • 父类的构造器不会被继承,但是会被调用,有些还需要我们手动调用
  • 使用继承可以提高代码的复用性
    • 当父类修改一处代码的时候,所有的子类都会受到影响
  • 在Java中只有单继承
    • 一个子类只能继承一个父类
    • 这就要求大家在抽象的时候要遵循一定的规则,要严谨
    • 继承中也不允许父类继承子类的情况
  • Object在java中是所有类的祖先类(根基类)
    • 所有的类默认继承自Object
    • 如果当前类继承了其他类,那么其他类也会继承Object
    • 也就是说,不管什么类最终都会继承Object,拥有Object所有的方法
      • 可见:Object中的方法非常重要
  • 当继承的父类也继承了其他类
    • 子类会拥有整个继承练所有的属性和方法

super

  • 使用到属性方法上面
    • 当我们调用子类的属性或者方法的时候,默认从当前类开始查找
    • 如果当前子类没有这个属性或者方法,就从父类中找,依次类推直到Object类为止
    • 如果当前类和子类同时拥有一个同名的属性或者方法,那么父类的就不会被调用到
    • 如果想直接调用父类的方法,需要在方法前加 super关键字
    • 当我们打印一个对象的时候,默认会打印对象的toString()方法
  • 使用到构造器上
    • 构造器就是创建对象之后,对对象的属性进行初始化
    • 如果涉及到继承关系,会优先调用父类构造器,然后再调用子类构造器
    • 子类默认会调用父类无参的构造器,如果无参构造器失效代码将会报错
      • 父类添加一个无参的构造器
      • 手动指定父类的有参构造器
    • 使用super关键字可以调用父类指定的构造器,而且必须写在第一行
      • 必须先初始化父类的属性然后再初始化子类的属性
    • super和this在调用构造器的时候不会同时出现
  • 理清楚方法和属性的调用顺序!!!

代码块

  • JVM帮我们主动去执行的一系列操作
  • 非静态代码块每次调用构造器之前都会优先调用代码块
  • 创建对象之前会按照先后顺序执行代码块
    • 假如我们的构造器有4种,用户可以任选一种创建对象
    • 而对象在初始化之前需要做一些检查操作,我们只需要将检查代码写入到代码块即可完成检查
    • 无论选择那种构造器都会先执行代码块
  • 静态代码块
    • 静态代码块只执行一次,因为它隶属于类,类只会被之家一次

重写

  • 当子类继承父类的方法之后,对父类的方法不满意可以自己重写定义方法的实现
    • 这个操作就被称为重写
  • 实现重写需要满足
    • 两个类必须存在继承关系
    • 两个类中方法的签名是完全一致的
      • 方法名字,参数的(类型,数量,顺序),返回值类型
  • 当子类调用重写方法的时候,就不在调用父类的原始方法

多态

  • 例子
    • 明天我请你吃大餐?(兰州拉面,小龙虾)
  • 特征
    • 提前声明一个很模糊的概念,真正实现的时候才传入一个具体的类
    • 调用指定方法的时候有传入的真正对象完成实现
  • 实现多态
    • 前提:
      • 要有继承
      • 要有重写
      • 要父类引用指向子类对象(子类对象拥有父类的所有属性和方法)
  • java能实现多态很主要一个原因在于
    • 编译期只能判断语法是否正确
    • 运行期才会知道具体给参数传入的变量,才能根据变量调用对应的方法
  • 数据类型的转换
    • 基本数据类型
      • 要根据变量类型对应字节的长度,进行转换
    • 引用数据类型
      • 自动
        • 将子类转成父类的时候可以自动转换
      • 手动
        • 将父类转成子类的时候编译代码没有问题,但是运行时代码出错
        • java.lang.ClassCastException

Object

  • Object常用方法
    • getClass–》反射
      • 获取当前类的信息
    • hashCode
      • 计算当前对象的hash值,一般认为hashcode相同的概率非常小
    • equals
      • 比较两个对象是否理论上相等
      • 默认情况下,比较的是物理地址
    • toString
      • 打印当前对象的一些信息
      • 默认打印对象类@hashcode的十六进制