学习笔记-基础知识5-面向对象(2)

2 篇文章 0 订阅
2 篇文章 0 订阅

面向对象(2)

1.基本数据类型的包装类
把基本数据类型称为对象:
Number类的子类:
Integer int,
Byte byte,
Float float,
Double double,
Short short,
Long long,
Object直接子类:
Character char,
Boolean boolean
8个类都是final修饰的(不可被继承)。

2.基本数据类型和包装类相互转换
把基本数据类型→ 包装类:
通过对应包装类的构造方法实现
除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象。
包装类→ 基本数据类型
包装类的实例方法xxxValue();
boolean bool = false;
Boolean b2 = new Boolean(bool);

jdk1.5 开始出现的特性:
自动装箱:可把一个基本类型变量直接赋给对应的包装类对象或则Object对象
自动拆箱:允许把包装类对象直接赋给对应的基本数据类型
Integer i = 3;装箱
int i2 = i;拆箱

3.基本类型和String之间的转换
String → 基本类型,除了Character外所有的包装类提供parseXxx(String s)静态方法,
用于把一个特定的字符串转换成基本类型变量;
基本类型→ String,String 类有静态方法valueOf(),
用于将基本类型的变量转换成String类型。
String str = “17”;
int i = Integer.parseInt(str);//String –> 基本类型
String s1 = String.valueOf(i);//基本类型–> String

4、Object类
所有类的公共父类,一切数据类型都可用Object接收。
常见方法
public boolean equals(Object obj):对象比较
public int hashCode():取得该对象的Hash 码
public String toString():对象描述

Object 类的toString()方法:“对象的描述”
    建议所有类都覆写此方法
    直接打印输出对象时,会调用该对象的toString()方法。
    全限定类名+@+十六进制的hashCode 值,等价于
    全限定类名+@+IntegertoHexString(该对象.hashCode)
    equals是判断是否指向同一个对象
String覆写了Object的equals方法:只比较字符的序列是否相同
==用于判断两个变量是否相等,引用类型,必须指向同一个对象,才true,只能比较有父子或平级关系的两个对象

5.代码块
代码块指的是使用”{}”括起来的一段代码,根据代码块存在的位置可以分为4种:
代码块里变量的作用域:只在自己所在区域(前后的{})内有效;
普通代码块:普通代码块就是直接定义在方法或语句中定义的代码块:
构造代码块:直接写在类中的代码块,优先于构造方法执行,每次实例化对象之前都会执行构造代码块。
静态代码块:使用static修饰的构造代码块:
优先于主方法执行,优先于构造代码块执行,
不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值;

class Demo1
{
    Demo1()
    {
        System.out.println("构造方法!");
    }
    {
        System.out.println("构造代码块!");//实例化对象的时候才会去调用!
    } 
    static
    {
        System.out.println("静态代码块!");
    }
    public static void main(String[] args) 
    {
        new Demo1();
        new Demo1();//静态代码块都只执行一次
        System.out.println("普通代码块!");
    }
}

6.构造方法的私有化
有时为了避免外界创建某类的实例,就将某类的构造方法私有化,即将它的构造方法用private修饰:
提供get方法让外界使用

7.单例模式-Singleton模式
目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例。
常见单例模式类型:
饿汉式单例:直接将对象定义出来
懒汉式单例:只给出变量,并不将其初始化;
饿汉式,static 修饰,随着类的加载而加载,会损耗性能,但是方法相对简单
懒汉式第一次用的时候相对较慢,因为需要加载!线程,不安全!

//单例模式

//饿汉式,直接把对象构造出来
class SingleDemo
{
    private static SingleDemo s1 = new SingleDemo();
    private SingleDemo()
    {
        //提供私有化的构造方法,那么外界就不能构造对象了!
    }
    public static SingleDemo getS1() 
    {
        return s1;
    }
}
//懒汉式,先定义,但是不创建对象
class SingleDemo2
{
    private static SingleDemo2 s3 ;
    private SingleDemo2()
    {
        //提供私有化的构造方法,那么外界就不能构造对象了!
    }
    public static SingleDemo2 getS3() 
    {
        //这是一个方法,返回值为创建的对象!
        if(s3 == null)
        {
            s3 = new SingleDemo2();//创建对象!
        }
        return s3;
    }
}

8.final 关键字
final可以修饰类,方法,变量。
final修饰类不可以被继承,但是可以继承其他类。
final修饰的方法不可以被覆写,但可以覆写父类方法。
final修饰的变量称为常量,这些变量只能赋值一次。
内部类在局部时,只可以访问被final修饰的局部变量。
final修饰的引用类型变量,表示该变量的引用不能变,而不是该变量的值不能变;

9.抽象类
定义:通过abstract关键字来修饰的类称为抽象类;
抽象类用public修饰,里面可以有用private修饰的方法(没有方法体),强制子类进行覆写;
抽象方法:被abstract修饰的方法
抽象方法只有返回类型和方法签名,没有方法体。
注意:
抽象类可以含有普通方法
抽象类不能创建实例对象(不能new)
需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类
抽象方法要存放在抽象类中。
抽象方法也可以存在于接口中
常见的几个抽象类:
流的四个基本父类:InputStream,OutputStream,Reader,Writer
abstract方法:功能声明相同,但功能主体不同。

10.抽象类的体现-模板模式
模板模式:定义功能时,功能的一部分是确定的,一部分是不确定的,而确定的部分在使用不确定的部分,
这时就将不确定的部分暴露出去,交给该类的子类去完成。
模板模式应用的简单规则:
抽象父类可以只定义需要使用的某些方法,其余留给子类去实现;
父类提供的方法只是定义了一个通用算法,其实现必须依赖子类的辅助;
如果父类的方法不想被子类覆写,那么可以在前面加上final关键字修饰。

11.接口(interface)
接口只定义了类应当遵循的规范,却不关心这些类的内部数据和其方法内的实现细节.
接口只规定了这些类里必须提供的方法;从而分离了规范和实现.增强了系统的可拓展性和维护性;
使用接口的好处:拓展性,维护性更好。
interface定义
接口定义了一种规范,规定一个类必须做什么,但它不管如何具体去做;
[修饰符] interface 接口名extends 父接口1,父接口2….
没有构造方法,不能实例化;
接口只能继承接口,不能继承类
接口里没有普通方法,方法全是抽象的;
接口里的方法默认修饰符是public abstract;
接口里的字段全是全局常量,默认修饰符是public static final;
接口里的成员包括(主要是前两个):全局常量,公共的抽象方法,内部类(包括内部类,内部接口,内部枚举类);
接口里的方法必须全部覆写!

12.接口的使用
格式:public class SubImpl extends Super implements IA,IB
接口可以多继承,但是只能继承接口,不能继承类。
实现接口(支持多实现):[修饰符] class 类名implements 接口1,接口2…
接口的实现必须在extends之后;
实现接口的方法必须是public类型
接口不能创建实例,但是可以声明引用类型的变量。此时,引用类型的变量必须指向到其实现类对象。
例题:简单工厂模式:构建一个工厂出来,在里面进行生产,用的时候直接拿

13.接口和抽象类的比较
相同点:都位于继承的顶端,用于被其他实现或继承;
都不能实例化;
都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;
接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
接口不能有构造函数,抽象类是可以有构造函数的,

14.匿名内部类
适合只使用一次的类
不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
匿名内部类不能定义构造器,因为匿名内部类没有类名。
格式:
new 父类构造器([实参列表]) 或接口()
{
//匿名内部类的类体部分
}
15.枚举类……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值