美文网首页
面向对象(下)

面向对象(下)

作者: Kevin_Huang54 | 来源:发表于2019-02-13 15:20 被阅读0次

包装类

  • 8种基本类型不同于对象,没有成员变量和方法可以调用,在内存中也能存储在任何地方,包括栈内存、堆内存
  • 之所以提供这八种类型,是为了以及储存方便,也可能是照顾程序员的习惯
  • 8种基本类型都有各自对应的对象类型
  • 基本类型可以自动转变为对象类型,称为自动装箱
    Integer i = 123
  • 相反的过程称为自动拆箱
    int i = new Integer(123)
  • 包装类可以与基本类型直接比较
    Integer i == 123; i == 123; 返回true
  • 考虑如下情况
Integer i1 = 12;
Integer i2 = 12;
i1 == i2; //返回true
Integer i1 = 1234;
Integer i2 = 1234;
i1 == i2; //返回false
  • 原因:Java对-127到128之间的数字使用缓存,该范围内不同的Integer引用同一个对象,如果超出这个范围,就会创建一个新的Integer对象
  • 不推荐使用==, 应该使用包装类的compare方法比较两个包装类对象

==和equals

  • 对基本类型,只能用==,无需类型相同,只要数值相同即可
    'A'==65,返回true

  • String类型的==比较的是内存地址,与Java的String初始化机制有关

s1 = "黄晓明"
s2 = "黄" + "晓明"
s3 = "黄", s4 ="晓明", s5 = s3 + s4
s6 = new String("黄晓明")
s1 == s2,输出true
s1 == s5,输出false
s1 == s6,输出false

单例模式

  • 对有些类,希望只存在一个实例,例如dota中的Roushan只有一个
    要点:private static本类实例变量、private构造器、public方法获取单例
public class Roushan {
    //将本类对象设为私有成员变量
    private static Roushan instance;
    private int hp = 10000;
    private int damage = 100;

    //私有化构造器,使外界不能构造对象
    private Roushan() {
    }

    //公开方法获取唯一的对象
    public static Roushan getInstance() {
        if (null == instance) {
            instance = new Roushan();
        }
        return instance;
    }

    public static void main(String[] args) {
        //调用类方法获取单例对象
        Roushan roushan = Roushan.getInstance();
    }
}

final修饰符

  • final变量必须显式定义初始值,否则无法通过编译,系统不会自动初始化为0或者null

  • final类变量,只能以下之一中显式定义初始值:

    • 初始化时
    • 静态初始化块中
  • final实例变量,只能在以下之一中显式定义初始值

    • 初始化时
    • 普通初始化块
    • 构造器中
  • final形参

    • 在值传递时直接赋值,方法体中不能再修改
  • final局部变量,方法体中赋值后不能再修改

  • final方法

    • private final方法可以在子类中重新定义,但不属于重写
    • public final方法不能在子类中重写,编译出错
  • final类

    • final类不可被继承
  • 不可变类

    • 例如String,Double
    • 构建方法:
      1. 成员变量private final
      2. 构造器初始化成员变量,保证成员变量只在构造时赋值
      3. 只提供getter方法
      4. 不提供setter方法

抽象类

  • 抽象类是一种特殊的父类,把不能实现的方法定义为抽象方法,让子类去实现
    • 抽象类是一个模板
    • 抽象类为继承而存在,避免子类设计的随意性
    • 抽象类不能实例化
    • abstract只能修饰类和普通方法,不能修饰变量、构造器、静态方法
  • 满足以下三种情况的类必须是抽象类
    • 含有抽象方法
    • 继承了抽象类,但没有实现所有抽象方法
    • 实现了一个接口,但没有实现所有方法
  • 抽象类可以包含成员变量、构造器、普通方法、抽象方法、初始化块、内部类,其中的构造器只供继承使用,无法构造对象

接口

  • 接口应当理解为规范,是各个类中抽象出来的规范
  • 抽象类主要作为子类的公用模板,而接口主要规定了类之间的通信规范
  • 面向接口编程是一种松耦合的设计模式
  • 例如,主板上的插槽指定了一种规范,只要实现了该规范的硬件都能使用该插槽,至于该硬件是什么类型、什么厂商,主板无需关心
  • 接口支持多继承,即一个接口可以继承多个接口,获得这些接口的常量和抽象方法
  • 接口的元素
    1. 接口名称:可以使用形容词,如comparable、runable等
    2. 变量:只能是常量(pubic static final),且需要初始化
    3. 抽象实例方法:自动隐式添加public abstract,需要实现类去实现
    4. 类方法:直接使用接口来调用
    5. 默认方法:必须加default,实现类可以获得该方法,相当于继承

内部类

  • 内部类与成员变量、构造器、方法一样,是外部类的组成部分
  • 内部类可以使用public、default、protected、private四种修饰符
    • 相对地,外部类只能使用public和default
  • 内部类的好处:
    • 内部类可以是private, 不允许其他类访问内部类,提供更好的封装
    • 当一个类只与某一个类交互,就可以设计为这个类的private内部类
    • 与外部类有更好的交互
      -内部类可以访问外部类的所有变量和方法,包括私有的
      -外部类只能访问内部类的非私有方法,不能访问内部类的成员变量和私有方法

枚举类

  • 当一个类只能产生有限个实例时,使用枚举类
  • enum枚举类是一种特殊的类,与class和interface关键字并列
  • enum类默认继承java.lang.Enum类,而不继承Object类
  • enum类不能显式继承其他类
  • 构造示例
public enum Season {
    //所有实例必须在第一行列出,实际上等同于new若干个本类的public final static变量
    spring("春"), summer("夏"), autumn("秋"), winter("冬");

    private String name;
    //只能使用private构造器,即时不指定也默认是private
    Season(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
  • 枚举类可以实现接口,并在每个实例后实现各自的特殊方法
public enum Season implements Info{
    spring("春"){
        @Override
        public void info() {
            System.out.println("春暖花开");
        }
    }, summer("夏"){
        @Override
        public void info() {
            System.out.println("生如夏花");

        }
    }, autumn("秋") {
        @Override
        public void info() {
            System.out.println("风吹麦浪");
        }
    }, winter("冬") {
        @Override
        public void info() {
            System.out.println("银装素裹");
        }
    };
}
  • Enum类常用方法
    • static classname[] values(),获取枚举类的所有实例
    • int compareTo(实例名),根据定义顺序比较,返回1,0,-1
    • String toString(),返回实例名称
    • int ordinal(),根据类中定义的顺序,返回实例的索引号

相关文章

  • 面向对象(下)

    NSInteger:大致等于long型整数 根据设备不同可能等于long可能等于int NSUInteger:大致...

  • 面向对象(下)

    final关键字 final关键字可用于修饰类、变量和方法,他有“无法改变”或者“最终”的含义,因此被final修...

  • 面向对象(下)

    包装类 8种基本类型不同于对象,没有成员变量和方法可以调用,在内存中也能存储在任何地方,包括栈内存、堆内存 之所以...

  • 面向对象下

    继承简介• 继承是面向对象三大特性之一• 通过继承我们可以使一个类获取到其他类中的属性和方法• 在定义类时,可以在...

  • Python中的面向对象

    Python中的面向对象 面向过程和面向对象的区别 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据和函数绑...

  • Java基础44道

    1、解释下什么是面向对象?面向对象和面向过程的区别? 面向对象是一种基于面向过程的编程思想,是向现实世界模型的自然...

  • python面向对象(下)

    一、面向对象,这个对象到底是什么? 这个对象不是python中的实例,python中我们把一个类的实例也叫做对象,...

  • Java 浅析三大特性之一封装

    在说Java 三个特性之前,我们先了解一下什么是面向对象,以及为什么Java是面向对象的语言。面向对象是区别于面向...

  • 面向对象和面向过程解读

    首先来看一下常见的名词: OOA 面向对象分析(分析问题) OOD面向对象设计(定义问题) OOP面向对象编程(解...

  • Java知识点-基础篇-面向对象

    面向对象 什么是面向对象 面向对象与面向过程 面向过程自顶而下的编程模式:将一个问题分解成一个一个步骤,每个步骤使...

网友评论

      本文标题:面向对象(下)

      本文链接:https://www.haomeiwen.com/subject/cmkdeqtx.html