美文网首页《IT藏经阁》
IO 流中,inputstream能不能new

IO 流中,inputstream能不能new

作者: 辽A丶孙悟空 | 来源:发表于2019-03-18 23:04 被阅读264次
一、什么样的类不能被实例化
  • 接口
  • 抽象类
  • 构造方法的访问权限为私有
二、实例化

实例化是指在面向对象的编程中,通常把用类创建对象的过程称为实例化。

三、Java中创建(实例化)对象的五种方式
  • 1.用new语句创建对象,这是最常见的创建对象的方法。
  • 2.通过工厂方法返回对象
    如:Spring中通过getBean(“xxx”)获取Bean。
  • 3.调用对象的clone()方法

一个类必须实现Cloneable接口并重写clone()方法,其实例才能调用clone()方法,否则会抛出“CloneNotSupportedException”异常。

  public static void main(String[] args) throws Exception {
       Person p1 = new Person();
       p1.setName("howard");
       p1.setAge(20);
       Person p2 = (Person) p1.clone();
       System.out.println("p1 = " + p1);
       System.out.println("p2 = " + p2);
       System.out.println("p1 == p2 " + (p1 == p2));
       System.out.println("p1.getClass() == p2.getClass() " + 
       (p1.getClass() == p2.getClass()));

   }
}

class Person implements Cloneable {
   private String name;
   private int age;

   public String getName() {
       return name;
   }

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

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
   }

   @Override
   protected Object clone() throws CloneNotSupportedException {
       return super.clone();
   }
}
  • 运行程序,结果如下:


由此可见,克隆的对象与原对象,虽然字段内容都是相同的,但是两者并不相等,另外,它们的类对象却是相等的。

  • 4.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
/*
*通过反射对对象进行初始化
*注意必须有无参数的Constructor
*实例化Class类然后调用newInstance()方法
*
*/
class Person{
private int age;
private String name;
public int getAge() {
 return age;
}
public void setAge(int age) {
 this.age = age;
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String toString(){
 return "年龄是:"+this.age+"  姓名是:"+this.name;
 
} 
}
public class TestClass {
 public static void main(String[] args){
  Class< ?> c1 = null;
  try{
       c1 = Class.forName("org.whb.test.demo715.Person");
  }catch(ClassNotFoundException e){
   e.printStackTrace();
  }   
  Person p1 = null;
  try {
  p1 =(Person)c1.newInstance();
} catch (InstantiationException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IllegalAccessException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}

  p1.setAge(12);
  p1.setName("haobo");
  System.out.println(p1);
 }
}
  • 5.通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。

  1. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
public class ObjectSaver { 
public static void main(String[] args) throws Exception { 
 ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("D:/objectFile.swf")); 
 //序列化对象 
 Customer customer = new Customer("haobo", 24); 
 out.writeObject("你好!"); 
 out.writeObject(new Date()); 
 out.writeObject(customer); 
 out.writeInt(123); //写入基本类型数据 
 out.close(); 
 //反序列化对象 
 ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/objectFile.swf")); 
 System.out.println("obj1=" + (String) in.readObject()); 
 System.out.println("obj2=" + (Date) in.readObject()); 
 Customer obj3 = (Customer) in.readObject(); 
 System.out.println("obj3=" + obj3); 
 int obj4 = in.readInt(); 
 System.out.println("obj4=" + obj4); 
 in.close(); 
 } 
} 
class Customer implements Serializable { 
 /** 
 * 
 */ 
 private static final long serialVersionUID = -88175599799432325L; 
 private String name; 
 private int age; 
 public Customer(String name, int age) { 
  this.name = name; 
  this.age = age; 
 } 
  public String toString() { 
   return "name=" + name + ", age=" + age; 
  } 
 } 

相关文章

  • IO 流中,inputstream能不能new

    一、什么样的类不能被实例化 接口抽象类构造方法的访问权限为私有 二、实例化 实例化是指在面向对象的编程中,通常把用...

  • Java中的IO流

    Java中的IO流分类 输入IO流输入字节流(InputStream)处理流缓冲流(BufferedInputSt...

  • Java中Stream操作

    Java中Stream操作 流 此处的流(Stream)与io中的输入流(InputStream)与输出流(Out...

  • java io 流

    java io 流 io 流总览 io 流主要提供四个接口 InputStream: 输入字节流 OutputSt...

  • Java装饰器模式,从IO流讲起

    从Java IO流讲起 在java中, 字节输入流InputStream和字节输出流OutputStream, 文...

  • IO

    IO流:用于处理设备上的数据,即:InputStream,OutputStream IO流的具体分类:1,根据处理...

  • 【JAVA8新特性】- 使用流Stream(转载)

    Java 8 中的 Stream 俗称为流,它与 java.io 包里的 InputStream 和 Output...

  • Java中常用的字节流和字符流

    IO流(输入流、输出流) 字节流、字符流 1.字节流: InputStream、OutputStream Inpu...

  • Java之IO(五)IO流操作规律

    由于IO流中对象很多,在实际开发中,到底使用哪些对象呢? 字节流 InputStream父类 -FileInp...

  • JAVA读取Excel数据

    思路: 先用inputstream获取excel文件的io流 然后创建一个内存中的excel文件XSSFWorkb...

网友评论

    本文标题:IO 流中,inputstream能不能new

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