现在的位置: 首页 > 综合 > 正文

面向对象(二)——装箱、equals、单例类、接口、模式

2018年04月06日 ⁄ 综合 ⁄ 共 5028字 ⁄ 字号 评论关闭

为了结局8个基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper Class)

boolean b1 = true;
Boolean b1Obj = new Boolean(b1);
int it = 5;
Integer itObj = new Integer(it);
Float f1 = new Float("4.56");
Boolean bObj = new Boolean("false");

boolean bb = bObj.booleanValue();
int i= itObj.intValue();
float f = f1.floatValue();
自动装箱和自动拆箱
Integer inObj = 5;
Object boolObj = true;
int it = inObj;

包装类还可实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都提供了一个parseXxx(String s)
静态方法,用于将一个特定字符串转换成基本类型变量:除此之外,在String类里也提供了多个重载valueOf()方法,
用于将基本类型变量转换成字符串。

String intStr = "123";
int it = Integer.parseInt(intStr);
String floatStr = "4.56";
float ft = Float.parseFloat(floatStr);
String ftStr = String.valueOf(2.345f);
String dbStr = String.valueOf(3.344);
String boolStr = String.valueOf(true);

把基本类型变量转换成字符串,还有一种更简单的方法:将基本类型变量和""进行连接运算,
String intStr = 5 +"";

==不可比较类型上没有父子关系的两个对象。
int it = 65;
float f1 = 65.0f;
(it == f1) true
char ch = 'A';
(it == ch) true;
下面是两个引用类型变量
String str1 = new String("hello");
String str2 = new String("hello");
(str1 == str2) false
(str1.equals(str2))  true

String已经重写了Object的equals()方法,String的equals()方法
判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过
equals()比较将返回true;否则将返回false。

比较成熟的equals()方法应保持如下形式
public boolean equals(Object obj)
{
  //待比较的两个对象是同一个对象,直接返回true
  if(this==obj)
  {
    return true;
   }
  //只有当obj是Person对象
  if(obj != null && obj.getClass() == Person.class)
   {
      Person personObj = (Person)obj;
      //并且当前对象的idStr与obj对象的idStr相等才可判断啷个对象相等
     //idStr是Peson的一个属性变量
      if(this.getIdStr().equals(personObj.getIdStr()))
       {
          return true;
       }
 
     
   }
  return false;
}

如果一个类始终只能创建一个实例,则这个类被称为单例类。
把该类的构造器使用private修饰。
一旦把该类的构造器隐藏起来,则需要提供一个public方法作为该类的访问点,用于创建该类的对象,
且该方法必须使用static修饰。(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)
class Singleton
{
   //使用一个变量来缓存曾经创建的实例
  private static Singleton instance;
  //将构造器使用private修饰,隐藏该构造器
  private Singleton(){}
  //提供一个静态方法,用于返回Singleton实例
  //该方法可以加入自定义的控制,保证只产生一个singleton对象
  public static Singleton getInstance()
  {
   //如果instance为null,标明还不曾创建singleton对象
   if(instance == null)
   {
     //创建一个singleton对象,并将其缓存起来
     instance = new Singleton();
    }
   return instance;
   }
}
public class TestSingleton
{
   public static void main(String[] args)
   {
    //创建Singleton对象不能通过构造器,只能通过getInstance方法
   Singleton s1= Singleton.getInstance();
   Singleton s2= Singleton.getInstance();
  //将输出true
  System.out.println(s1==s2);
   }
}

 

在接口中定义属性时,不管是否使用public static final修饰符,接口里的属性总将使用这三个修饰符来修饰。

接口里只能包含抽象方法,不包含已经提供实现的方法:抽象类则完全可以包含普通方法。
接口里不能定义静态方法;抽象类里可以定义静态方法。
接口里只能定义静态常量属性,不能定义普通属性:抽象类里则既可以定义普通属性,也可以定义静态常量属性。
接口不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而让其子类调用这些构造器来完成属于抽象类的初始化操作。
接口里不能包含初始化块,但抽象类则完全可以包含初始化块。
一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

命令模式
public interface Command
{
   void process(int[] target);
}

public class ProcessArray
{
 public void process(int[] target,Command cmd)
 {
   cmd.process(target);
 }
}

public class TestCommand
{
  public static void main(String[] args)
  {
   ProcessArray pa = new ProcessArray()
   int[] target = {3,-4,5,4};
   pa.process(target,new PrintCommand());
   System.out.println("..............");
   pa.process(target,new AddCommand());
  }
}

public class PrintCommand implements Command
{
  public void process(int[] target)
  {
     for(int tmp : target)
     {
       System.out.println("迭代输出目标数组的元素"+tmp);
      }
  }
}

public class AddCommand implements Command
{
   public void process(int[] target)
  {
     int sum = 0;
     for(int tmp : target)
     {
        sum+=tmp;
     }
    System.out.println("数组元素总和是:"+sum);
   }
}

 

 

工厂模式

public interface Output
{
  int MAX_CACHE_LINE = 50;
   void out();
   void getData(String msg);
}

interface Product
{
   int getProductTime();
}

public class Printer implements Output,Product
{
  private   String[] printData = new String[MAX_CACHE_LINE];
  private int dataNum =0;
  public void out()
  {
   while(dataNum > 0)
   {
     System.out.println("打印机打印"+printData[0]);
    //将作业队列整体前移一位,并将剩下的作业数减1
     System.arraycopy(printData,1,printData,0,--dataNum);
    }
  }
}

public void getData(String msg)
{
   if(dataNum >= MAX_CACHE_LINE)
    {
    System.out.println("输出队列已满,添加失败");
   }
   else
  {
    printData[dataNum++] = msg;
   }
}

public int getProductTime()
{
   return 45;
}
public static void main(String[] args)
{
   //创建一个Printer对象,当成Output使用
  Output o = new Printer();
  o.getData("     11111111");
  o.getData(" ddddddd");
  o.out();
  Product p = nw Printer();
  System.out.println(p.getProduceTime());
  //所有接口类型的引用变量都可直接赋给java.lang.Object类型的变量
  Object obj = p;
}

public class Computer
{
  private Output out;
  public Computer(Output out)
  {
    this.out = out;
  }
  public void keyIn(String msg)
  {
    out.getData(msg);
  }
  public void print()
  {
   out.out();
   }
}

public class OutputFactory
{
  public Output GetOutput()
  {
   //下面两行代码用于控制系统到底使用Output的哪个实现类
   //return  new Printer();
   return new BetterPrinter();
  }
  public static void main(String[] args)
  {
   OutputFactory of = new OutputFactory();
   Computer c = new Computer(of.getOutput);
   c.keyIn("ddddddd");
   c.keyIn("aaaaaa");
   c.println();
  }
}

public class BetterPrinter implements Output
{
 private String[] printData = new String[MAX_CACHE_LINE * 2];
 //用以记录当前需打印的作业数
 private int dataNum = 0;
 public void out()
 {
  //只要还有作业,继续打印
  while(dataNum > 0)
  {
   System.out.println("高速打印机正在打印:" + printData[0]);
   //把作业队列整体前移一位,并将剩下的作业数减1
   System.arraycopy(printData , 1, printData, 0, --dataNum);
  }
 }
 public void getData(String msg)
 {
  if (dataNum >= MAX_CACHE_LINE * 2)
  {
   System.out.println("输出队列已满,添加失败");
  }
  else
  {
   //把打印数据添加到队列里,已保存数据的数量加1。
   printData[dataNum++] = msg;
  }
 }
}

抱歉!评论已关闭.