IO流,代码快照图,工厂方法,重写hashCode(),委托vs继承

IO流

在这里插入图片描述
① I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。

②Java程序中,对于数据的输入输出操作以”流(stream)" 的方式进行。

③java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据

④输入input:读取外部数据(磁盘、 光盘、数据库、网络等存储设备的数据)到程序(内存)中。

⑤输出output:将程序(内存)数据输出到磁盘、光盘、数据库、网络等存储设备中

什么是文件

文件就是保存数据的地方

文件流

文件在程序中是以流的形式来操作的

在这里插入图片描述

常用文件操作
创建文件对象
new File(String pathname);//根据路径构建一个File对象
new File(File parent,String child)//根据父目录文件+子路径构建
new File(String parent,String child)//根据父目录+字路径构建
    
File file =new File();//选择上面三个里的一种

创建文件

file.creatNewFile();//创建文件

File parentFile = new File("e:\\");
String fileName = "new.txt";
File file = new File(parentFile, FileName);
try{
    file.creatNewFile();
    System.out.println("创建成功!");
} catch (IOException e){
    e.printStackTrace();
}//这段代码会在e:\\目录下创建文件"new.txt"
获取文件的相关信息
File file = new File("e:\\news.txt");

System.out.println("文件名字=" +file.getName());
System.out.println("文件绝对路径=" + file.getAbsolutePath());
System.out.println("文件父级目录=" + file.getParent());
System.out.println("文件大小(字节)=" + file.length());
System.out.println("文件是否存在=" + file.exists());//T
System.out.println("是不是一个文件=" + file.isFile());//T
System.out.println("是不是一个目录=" + file.isDirectory());//F####
InputStream:字节输入流

常用子类

FileInputStream:文件输入流

BufferedInputStream:缓冲字节输入流

ObjectInputStream:对象字节输入流

OutputStream:字节输出流

常用子类

FileOutputStream:文件输出流

软件构造相关知识
代码快照图(snapshot)

描述程序运行时内存里变量层面的状态

在这里插入图片描述

Spec

全称specification,规约,程序要按规约实现

健壮性

正确性:软件的行为严格遵守规约中定义的行为

健壮性是针对异常情况的处理,当出现规约定义之外的行为的时候,软件要做出恰当反应

工厂方法

1.定义和主要作用

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

2.使用步骤

步骤1: 创建抽象工厂类,定义具体工厂的公共接口

abstract class Factory{
    public abstract Product Manufacture();
}

步骤2: 创建抽象产品类 ,定义具体产品的公共接口;

abstract class Product{
    public abstract void Show();
}

步骤3:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;

//工厂A类 - 生产A类产品
class  FactoryA extends Factory{
    @Override
    public Product Manufacture() {
       return new ProductA();
    }
}
//工厂B类 - 生产B类产品
class  FactoryB extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductB();
    }
}

步骤4: 创建具体产品类(继承抽象产品类), 定义生产的具体产品;

//具体产品A类
class  ProductA extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}
//具体产品B类
class  ProductB extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}

步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

//生产工作流程
public class FactoryPattern {
    public static void main(String[] args){
       //客户要产品A
        FactoryA mFactoryA = new FactoryA();
        mFactoryA.Manufacture().Show();
       //客户要产品B
        FactoryB mFactoryB = new FactoryB();
        mFactoryB.Manufacture().Show();
    }
}

结果:

生产出了产品A
生产出了产品C
静态工厂方法

1.定义

静态工厂方法指的是在类中提供一个公有的静态方法,返回类的一个实例。

2.优势

①类的构造器被限制为类名,而静态工厂方法可以提供不同的函数名称作为不同构造方法。

②不必在每次调用时都创建新的对象

③他们可以返回原返回类型的任何子类型的对象

④在创建参数化类型的实例的时候,他们使代码变得更加简介

3.缺点

①类如果不含有共有的或受保护的构造器,就不能被子类化。
②他们与其他的静态方法实际没有任何区别

hashCode()方法

1.作用

hashCode的存在主要是为了查找的快捷性,hashCode是用来在散列存储结构中确定对象的存储地址的

2.equals方法和hashCode的关系

在比较相等时,先通过hashCode()去比较,如果hashCode相等,才会再去用equals()去比较两个对象是否相等。

所以建议重写equals()时,顺便重写hashCode(),使他们在equals相等时,也会有相同的hashcode值。

3.重写hashCode()

@Override
	public int hashCode() {
		int result = name.hashCode();
		result = 17 * result + sex.hashCode();
		result = 17 * result + age.hashCode();
		return result;
	}

重写hashCode()有个相对固定的写法:先整理出你判断对象相等的属性,然后取一个尽可能小的正整数(尽可能小时怕最终得到的结果超出了整型int的取数范围),这里我取了17,然后计算17*属性的hashcode+其他属性的hashcode,重复步骤。

委托vs继承

如果子类只需要复用父类中的一小部分方法,可以不需要使用继承,而是通过委派机制来实现。一个类不需要继承另一个类的全部方法,通过委托机制调用部分方法,从而避免大量无用的方法。

在这里插入图片描述

这个图表示得很清楚,委托的精髓在于新建一个类,里面有另一个类的实例化对象,调用方法时,调用这个其他类的方法。

值得一提的是,属性实现委托是长时效性,方法实现委托是短时效性。

参考:https://blog.csdn.net/varyall/article/details/82355964

​ https://blog.csdn.net/weixin_38405253/article/details/91922340

感谢大佬😃

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值