20160717 代码块/静态/工具类设计思想/制作文档/单列设计模式

/*
面向对象思路回顾:
1.他是相对面向过程而言,面向对象和面向过程都是一种编程思想
2.面向对象的特点
  a.它比较符合人们行为思考习惯
  b.将复杂事情简单化
  c.它将我们由以前的执行者变成了指挥者
3.以后我们有功能需求时需要找相关的对象来帮我们完成,如果没有对应的对象,那么我们要自己来写这个对象供别人使用

*/

/*
代码块:
   1.局部代码块 提高程序效率
   2.构造函数
      无参构造函数
   3.构造代码块
       每new一次对象时候都会调用一次构造代码块

对象在内存中初始化过程 Person p=new Person();
   0.将Person.class字节码文件加载到内存中
   1.在栈内存中初始化p,开辟一个空间给p;
   2.给p默认初始化,将null赋值给p
   3.在堆内存中初始化Person()对象
   4.调用对象的构造代码块(如果有的话)
   5.调用对象对应的构造函数(如果有的话)
   6.将堆内存中的Person对象地址赋值给p
      
*/
class ObjectDemon1 
{
	public static void main(String[] args) 
	{
		int num=4;//执行之后在虚拟机内消失了
		System.out.println(num);//局部代码块

   //System.out.println(num);//ObjectDemon1.java:23: 错误: 需要<标识符>

	//调用无参构造函数
	Person p=new Person();

	System.out.println("********|*******");

	//调用有參构造函数;
	Person p1=new Person("109");
	}
	
}

class Person
{   
	{   
		cry();
		System.out.println("构造代码块");//先执行局部代码块,无关存放顺序
    }

{
System.out.println("***************");//局部代码块有顺序
}

	private String name; 
	//无参数构造函数
	Person()
		{
		//cry();
		 System.out.println("无参构造函数");
	    }

    //有参数构造函数
	Person(String name)
		{
		//cry();
		this.name=name;
		System.out.println(name);
	    }

     public static void cry()
		  {
		   System.out.println("哇哇");
	      }
}

*****************************************************************

<pre name="code" class="java">/*
static 关键字
用于修饰成员(成员变量和成员函数)

被修饰后的成员具备以下特点:
1.随着类的增加而增加
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名调用
注意:
1.静态方法只能访问静态成员
2.静态方法中不能用super,this关键字
3.主函数是静态的

静态在什么场景下适合使用?
    所有的对象都有一个公共的属性值的时候
    
	例子:学生--->(共用)饮水机,--->(学习)老师
*/
class Person
{
	String name;//输于对象级别的成员属性
	static String country="英国";//static修饰成员变量//属于所有对象共享的成员属性

	public void showInfo()
		{
		System.out.println(name);
	  //System.out.println(this.name/country);这是正确的
		System.out.println(country);
		
	    }
}
class StaticDemon2 
{
	public static void main(String[] args) //static修饰成员函数
	{
		Person p1=new Person();
		p1.name="威廉";
		//p1.country="英国";
		p1.showInfo();

		Person p2=new Person();
		p2.name="凯特";
		//p2.country="英国";
		p2.showInfo();

        //静态修饰的成员变量可以被所有对象共享
		Person p3=new Person();
		System.out.println("p3"+p3.name);
		System.out.println("p3"+p3.country);

		//可以通过类名方式 直接调用
		System.out.println("类名方式 调用结果"+Person.country);

		p3.country="美国";

		System.out.println(Person.country);
		System.out.println("p1:"+p1.country);

	}
}

**********************************************************************************

<pre name="code" class="java">/*
  静态变量和成员变量区别:
   1.静态变量是随着累的加载而初始化,成员变量是随着对象的创建而初始化
     静态变量生命周期和类是一直的,  成员变量的声明周期和对象是一致的

   2.静态变量可以通过类名方式直接调用,通常叫做"类的变量"(非官方)
     成员变量只能通过对象来调用,对象.属性(成员变量)

   3.静态变量是存在方法区中的静态块
     成员变量是在堆内存中的对象中

   4.静态变量可以被所有的对象共享
     成员变量只能局限于该对象使用

使用静态变量注意事项:
   1.静态方法只能访问静态成员
      普通方法可以去引用静态成员
   2.静态方法中不能用super,this关键字//用静态方法的时候,对象还没有产生,怎么能调用this
   3.主函数是静态的
*/
class Person
{
	String name="破晓";
	static String country="中国";

	public void showInfo()
		 {
		   System.out.println(name);
		   System.out.println(country);
	     }

    //"静态方法"里面无法应用非静态name 
    public static void showInfo1()
		 {
			//System.out.println(name);//StaticDemon3.java:34: 错误: 无法从静态上下文中引用非静态 变量 name
			System.out.println("1"+country);//System.out.println(this.country);//StaticDemon3.java:36: 错误: 无法从静态上下文中引用非静态 变量 this
	        System.out.println(Person.country);
		 }
}
class  StaticDemon3
{
	public static void main(String[] args) 
	{
		Person p1=new Person();
		p1.name="威廉";
		//p1.country="英国";
		p1.showInfo1();

		Person p2=new Person();
		p2.name="凯特";
		//p2.country="英国";
		p2.showInfo();

        //静态修饰的成员变量可以被所有对象共享
		Person p3=new Person();
		System.out.println("p3"+p3.name);
		System.out.println("p3"+p3.country);

		//可以通过类名方式 直接调用
		System.out.println("类名方式 调用结果"+Person.country);

		p3.country="美国";

		System.out.println(Person.country);
		System.out.println("p1:"+p1.country);
	}
}

***********************************************************************************

<pre name="code" class="java">/*
  main函数详解

  main是一个类的函数入口,jvm需要利用这个函数来做一个入口进入
  不止java,c任何一门的主函数都叫main

  static 原因: 通过类名方式StaticDemon4.main()直接调用,不需要创建对象后方才能调用
  
  public 最大的访问权限,jvm任意调用

  void "没有"--main函数没有返回值.jvm执行main函数 不需要 返回值

  main  其他语言有可能Main  ps:java语言中不能用大写的Main

  String[]args 在什么地方才能给main函数传参数?在控制台调用java命令的时候可以直接传参
               为什么要这么做?可以控制输入参数
  */

class  StaticDemon4
{
	public static void main(String[] args) 
	{
		System.out.println(args);//变量的内存地址
		System.out.println(args.length);//0
		
		//拿到第一个参数
		System.out.println(args[0]);//数组角标越界
		System.out.println(args[1]);

		for (int i=0;i<args.length ;i++ )
		{
			System.out.println(args[i]);
		}
	}
}

******************************************************************
 

/*
  静态构造代码块
    总结:
<span style="white-space:pre">	</span>  1.不管创建多少个对象,静态构造代码块都只会执行一次
<span style="white-space:pre">	</span>  2.类加载时候就调用,相比构造函数是创建对象时候方便调用


<span style="white-space:pre">	</span>  构造代码块区别:
<span style="white-space:pre">	</span>    1.构造代码块每new一次都会被执行,但是静态代码块只会执行一次
<span style="white-space:pre">		</span>2.静态代码块会比构造代码块"先"执行
*/
class Person
{
<span style="white-space:pre">	</span>String name;
         {
<span style="white-space:pre">		</span> System.out.println(this.name);
<span style="white-space:pre">		</span> 
<span style="white-space:pre">		</span> }
<span style="white-space:pre">	</span>static
<span style="white-space:pre">		</span> {
<span style="white-space:pre">		</span>  System.out.println("巴菲特");
<span style="white-space:pre">	</span>     }
     Person()
<span style="white-space:pre">		</span> {
<span style="white-space:pre">		</span> System.out.println(name);
<span style="white-space:pre">	</span>     }
     Person(String name)
<span style="white-space:pre">		</span> {
<span style="white-space:pre">		</span> this.name=name;
<span style="white-space:pre">		</span> System.out.println(name);
<span style="white-space:pre">		</span> System.out.println(this.name);
<span style="white-space:pre">	</span>     }
}
class  StaticDemon5
{
<span style="white-space:pre">	</span>public static void main(String[] args) 
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>Person p1=new Person();
<span style="white-space:pre">		</span>Person p2=new Person("贝加特");


<span style="white-space:pre">		</span>Person p3=new Person("123");
        
<span style="white-space:pre">	</span>}
}

**************************************************************************

<pre name="code" class="java">/**
  工具类设计思想

  数组工具类:
    1.打印数组到工具台
	2.排序冒泡
	3.最大值查询
	4.根据元素值搜索返回角标

	制作文档:javadoc
	    格式:javadoc  -d arrayDoc -author -version ArrayTool6.java
		前提条件:

		@author lmd
		@version 1.0
*/

public class ArrayTool6
{   
	
	/**
	   1.打印数组到工具台
	   @param int [] array 需要被打印的数组
	*/
	public static void print(int[] array) 
	{
		for (int i=0;i<array.length ;i++ )
		{
			if(i==(array.length-1))
				{
				System.out.println(array[i]);
			    }
				else
					{
					System.out.print(array[i]+",");
				     }
		}
	}

	//2.冒泡排序

	//private关键字描述访问权限,只有当前类才能访问

	/**
	  在这里加文档注释没有任何意义,给自己的类用,不是给外面的类用
	
	*/
	private static void tihuan(int[]array,int x,int y)//静态
		{
                     int tem=array[x];
					array[x]=array[y];
					array[y]=tem;
	    }
		/**
		@param 这是一排序 冒泡排序
		*/
	public static void sort(int[]array)
	{
		for (int x=0;x<array.length ;x++ )
		{
			for (int y=x+1;y<array.length ;y++ )
			{
				if(array[x]>array[y])
					{ 
					 tihuan(array,x,y);
				    }
			}
		}
	}

	//3.最大值查询
	/**
	  最大值查询
	  @param int[]array 需要获取的数组
	  @return int 返回最大值
	*/
	public static int getMax(int[]array)
		{
          int tem=array[0];
		  for (int i=0;i<array.length ;i++)
		  {
			  if (array[i]>tem)
			  {
				  tem=array[i];
			  }
		  }
		  return tem;
		
	    }

    //4.根据元素值搜索返回脚标
	/**
	   根据元素值搜索返回脚标
	   @param int[] array 被查询的数组
	   @param int value 需要查询的值
	   @return int 返回值所在的数组中的脚标
	*/
	public static int getIndexByValue(int[]array,int value)
		{
		  int index=-1;
          for (int i=0;i<array.length ;i++ )
          {
             if (value==array[i])
             {
				 index=i;
             }
          }
		  return index;
	    }
}

*********************************************************************************

<pre name="code" class="java">/*
  当我们在一个类中引用另一个的时候,首先会去找该类的class的文件,
  如果找不到class文件就回去找对应的java文件,自动编译该类

  优化;
  1.工具类中的方法都是共性的,不是针对哪个对象而存在的
  2.将内部调用的方法私有化
*/
class ArrayTest7 
{
	public static void main(String[] args) 
	{
		int[]array1=new int []{1,3,2,6,5};
		/*
		ArrayTool6 tool=new ArrayTool6();
			{
			tool.print(array1);
		    }
		*/
			//当所有的类共用一样的方法
			//使用类直接调用方法
			ArrayTool6.print(array1);                        // 打印

			ArrayTool6.sort(array1);

            for(int i=0;i<array1.length;i++)                  //冒泡排序
			 {
			 System.out.print(array1[i]+",");
		     }
             
			 System.out.println();
			 System.out.println("****************");

			 int Max=ArrayTool6.getMax(array1);               //最大值

			 System.out.println(Max);

            int Index=ArrayTool6.getIndexByValue(array1,3);   //找脚标

			System.out.println(Index);
			 
	}
}

*(*********************************************************************
 

<pre name="code" class="java">/*
  单列设计模式
      设计模式是一种思想,不是具体代码实现
	  单列设计模式:在内存中保证只有一个对象

	  如何保证内存中只有一个对象?
	    1.我将构造函数私有化(new)
		2.类内部应该自己创建一个对象
		3.向外提供一个方法获取这个对象.

*/
class Person
{
	
	//1.我将构造函数私有化(new)
	private Person(){}

	//2.类内部应该自己创建一个对象   为了能让静态函数调用,需要使用static修饰  为了不能让外面的类直接访问p变量,需要private修饰
	private static Person p=new Person();

	//3.向外提供一个方法获取这个对象.  为了能让外面的类直接调用 需要用static修饰
	public static Person getPerson()
	{
	  return p;
	}

	//添加:
	public void show()
		{
		System.out.println("hello");
	    }
	

}
class SingleDemon801
{
	public static void main(String[] args) 
	{
	

     //如何判断两个对象是否是一个?
	 /*
	 Person p1=new Person();
	 Person p2=new Person();
	 System.out.println(p1==p2);
    */

	 //System.out.println(Person.p);//可以直接调用19行中的p

	 Person p1=Person.getPerson();
	 Person p2=Person.getPerson();
	 System.out.println(p1==p2);

	 Person p3=Person.getPerson();
	 System.out.println(p2==p3);


	 //添加:
	 p1.show();
	 p2.show();
	 p3.show();
	}
}

****************************************************************************

<pre name="code" class="java">/*
  单列设计模式 第二种方式

      设计模式是一种思想,不是具体代码实现
	  单列设计模式:在内存中保证只有一个对象

	  如何保证内存中只有一个对象?
	    1.我将构造函数私有化(new)
		2.类内部应该自己创建一个对象
		3.向外提供一个方法获取这个对象.


		两种设计方式的区别:
		第一种 类加载的时候就创建了对象
		第二种 需要的时候才会去创建对象

		在工作当中有个叫法
		 第一种是饿汉式
		 第二种是懒汉式

		 开发当中要用第一种
		 面试中使用第二种    线程安全问题

*/
class Person
{
	
	//1.我将构造函数私有化(new)
	private Person(){}

	//2.类内部应该自己创建一个对象   为了能让静态函数调用,需要使用static修饰  为了不能让外面的类直接访问p变量,需要private修饰
	private static Person p=null;

	//3.向外提供一个方法获取这个对象.  为了能让外面的类直接调用 需要用static修饰
	public static Person getPerson()
	{
		if (p==null)
		{
			p=new Person();//不使用,就不会在堆内存中开辟这个空间,节省
		}
	  return p;
	}

	//添加
	public void show()
		{
		System.out.println("hello");
	    }
	

}
class SingleDemon9
{
	public static void main(String[] args) 
	{
	

     //如何判断两个对象是否是一个?
	 
	 //Person p1=new Person();
	// Person p2=new Person();
	 //System.out.println(p1==p2);
    

	 //System.out.println(Person.p);//可以直接调用19行中的p

	 Person p1=Person.getPerson();
	 p1.show();                      //---------- java ----------
                                     //Exception in thread "main" java.lang.NullPointerException//空指针异常
	                                 //at SingleDemon9.main(SingleDemon9.java:52)
     //System.out.println(p1);//null

	 Person p2=Person.getPerson();

	 System.out.println(p1==p2);

	 //Person p2=Person.getPerson();
	 //System.out.println(p1==p2);
	}
}


************************************************************************
 





 



 


 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值