--------------android培训、java培训、期待与您交流! --------------
一、静态(static)
1、static关键字
class Person{
String name;//成员变量,也叫实例变量
/*country成员变量被静态修饰之后,其就被放入了方法区;不是存在于每个对象之中,而是被对象所共享访问。
*/
static String country="China";//静态变量,类变量
/*静态方法中只能调用静态成员变量,例如country;而不能调用非静态变量,例如调用name就会出错。
* */
static public void show(){
//System.out.println(name+":"+country);
System.out.println(country);
}
}
public class Demo {
public static void main(String args[]){
Person p=new Person();
System.out.println(p.country);//对象调用
System.out.println(Person.country);//类名直接调用静态变量
Person.show();//类名直接调用静态方法
}
}
public class MainDemo {
public static void main(String[] args) {
String arr[]={"haha","hehe","heihei"};
MainTest.main(arr);
}
}
class MainTest{
public static void main(String[] args) {
for(String i:args)
System.out.println(i);
}
}
3、静态什么时候使用
public class MainDemo {
public static void main(String[] args) {
Person.show();//类名直接调用静态方法。
}
}
class Person{
String name;
public static void show(){
System.out.println("Hello World!");
}//该方法没有访问到非静态数据,则可以定义为静态。
}
2:操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。
class ArrayTool{
/*为了更为严谨,强制让该类不能建立对象。
可以通过将构造函数私有化完成。
*/
private ArrayTool(){}
//获得最大值
public static int getMax(int arr[]){
int max=0;
for(int i=1;i<arr.length;i++){
if(arr[max]<arr[i]){
max=i;
}
}
return arr[max];
}
//获得最小值
public static int getMin(int arr[]){
int min=0;
for(int i=1;i<arr.length;i++){
if(arr[min]>arr[i]){
min=i;
}
}
return arr[min];
}
//选择排序
public static void selectsort(int arr[]){
int max;
//外循环进行元素顺序调换
//内循环获得每趟中部分数组中的最大元素下标
for(int i=1;i<arr.length;i++){
max=0;
for(int j=1;j<=arr.length-i;j++){
if(arr[j]>arr[max]){
max=j;
}
swap(arr,arr.length-i,max);
}
}
show(arr);
}
//冒泡排序
public static void bubblesort(int arr[]){
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){
/*相邻元素进行比较,若较前元素大于较后元素,
* 将其调转位置
* */
swap(arr,j,j+1);
}
}
}
show(arr);
}
//调转位置函数
private static void swap(int arr[],int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void show(int arr[]){
for(int i:arr){
System.out.print(i+" ");
}
System.out.println();
}
}
public class Demo {
public static void main(String args[]){
int arr[]={3,0,1,8,2,7,6,4,9,5};
int max=ArrayTool.getMax(arr);
System.out.println("max="+max);
int min=ArrayTool.getMin(arr);
System.out.println("min="+min);
ArrayTool.show(arr);
ArrayTool.selectsort(arr);
}
}
制作程序的说明书--API文档:
API英文全称 Application Program Interface 应用程序接口
java的说明书通过文档注释来完成
dos执行生成帮助文档的命令:
javadoc -d help -author -version Demo.java
javadoc java制作文档的工具
-d 目录
help 是文件夹名,如果当前没有该文件夹,会自动在当前目录创建。
-author 作者
-version 版本号
Demo.java 要制作的文档的java文件
要生成文档,必须在类名前加上public修饰,否则会报错。方法被public修饰才能在文档中看到,被private修饰的方法是不会出现文档中。
一个类中默认会有一个空参数的构造函数,
这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰符。
如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
默认构造构造函数的权限是随着的类的变化而变化的。
java工具类注释说明书实例:
/**
这是一个可以对数组进行操作的工具类,该类提供功能:获取最值、排序。
@author DuanGuangyu
@version V1.0
*/
public class ArrayTool{
/**
* 空参数构造函数
*/
private ArrayTool(){}
/**获取一个整形数组中的最大值。
* @param arr接收一个int类型的数组
* @return 返回该数组中的最大值
*/
public static int getMax(int arr[]){
int max=0;
for(int i=1;i<arr.length;i++){
if(arr[max]<arr[i]){
max=i;
}
}
return arr[max];
}
/**获取一个整形数组中的最小值。
* @param arr接收一个int类型的数组
* @return 返回该数组中的最小值
*/
public static int getMin(int arr[]){
int min=0;
for(int i=1;i<arr.length;i++){
if(arr[min]>arr[i]){
min=i;
}
}
return arr[min];
}
/**
* 给int数组进行选择排序。
* @param arr 接收一个int类型的数组。
*/
public static void selectsort(int arr[]){
int max;
//外循环进行元素顺序调换
//内循环获得每趟中部分数组中的最大元素下标
for(int i=1;i<arr.length;i++){
max=0;
for(int j=1;j<=arr.length-i;j++){
if(arr[j]>arr[max]){
max=j;
}
swap(arr,arr.length-i,max);
}
}
show(arr);
}
/**
* 给int数组进行冒泡排序。
* @param arr 接收一个int类型的数组。
*/
public static void bubblesort(int arr[]){
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){
/*相邻元素进行比较,若较前元素大于较后元素,
* 将其调转位置
* */
swap(arr,j,j+1);
}
}
}
show(arr);
}
/**
* 调换数组中元素位置
* @param arr 接收一个int类型的数组。
* @param a 要置换的位置
* @param b 要置换的位置
*/
private static void swap(int arr[],int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
/**
用于打印数组中的元素。打印形式是:elemet1 element2 ...
* @param arr 接收一个int类型的数组。
*/
public static void show(int arr[]){
for(int i:arr){
System.out.print(i+" ");
}
System.out.println();
}
}
{
静态代码块中的执行语句。
}
class StaticCode{
//构造函数给对应对象初始化
StaticCode(){
System.out.println("b");
}
StaticCode(int x){
System.out.println("d");
}
//静态代码块给类初始化
static{
System.out.println("a");
}
//构造代码块给对象初始化
{
System.out.println("c");
}
public static void show(){
System.out.println("show run");
}
}
public class StaticCodeDemo {
//该类中的两个static代码块先执行,然后执行main函数
static{
System.out.println("haha");
}
public static void main(String[] args) {
new StaticCode(5);
/*
//new StaticCode();
new StaticCode();//StaticCode类中的static代码块随着类的加载而执行,只执行一次。
System.out.println("Hello World!");
StaticCode.show();
*/
}
static{
System.out.println("heihei");
}
}
3、在堆内存中开辟空间,分配内存地址。 (例如内存中开辟了空间,分配地址为0x0023)
7、对对象进行对应的构造函数初始化。(进行构造函数初始化:name="zhangsan",age=20)
8、将内存地址赋给栈内存中的p变量。(将内存地址0x0023赋给p,则p指向对象Person("zhangsan",20))
class Person
{
private String name;
private int age;
private static String country = "cn";
Person(String name,int age)
{
this.name = name;
this.age = age;
}
{
System.out.println(name+".."+age);
}
public void setName(String name)
{
this.name = name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country="+country);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setName("lisi");
}
}
3、为了让其他程序对自定义的访问,可以对外提供一些访问方式。
对于事物该怎么描述,还怎么描述。
当需要该事物的对象保证在内存中唯一时,就将以上的三步加上即可。
class Single{
private Single(){}//私有化构造函数,禁止其他程序建立本类对象。
private static Single s=new Single();//在类中创建一个本类对象,对其进行静态私有修饰。
public static Single getInstance(){
return s;
}//向外提供本类对象。
}
public class SingleDmo {
public static void main(String[] args) {
Single ss=Single.getInstance();//获得Single类类型的对象。
Single s1=Single.getInstance();//s1和ss都是同一个对象。
}
}
class Single{
private int num;
public void setNum(int num){
this.num=num;
}
public int getNum(){
return num;
}
private Single(){}//私有化构造函数,禁止其他程序建立本类对象。
private static Single s=new Single();//在类中创建一个本类对象,对其进行静态私有修饰。
public static Single getInstance(){
return s;
}//向外提供本类对象。
}
public class SingleDmo {
public static void main(String[] args) {
Single s1=Single.getInstance();//获得Single类类型的对象。
Single s2=Single.getInstance();//s1和s2都是同一个对象。
//分别赋两个值
s1.setNum(5);
s2.setNum(6);
//输出的都是6.因为两个对象其实都是一个对象,先给对象中num赋的5被后来的6覆盖了。
System.out.println("s1:"+s1.getNum());
System.out.println("s2:"+s2.getNum());
}
}
饿汉式和懒汉式:
class Single{
private Single(){}
private static Single s=new Single();//先初始化对象
public static Single getInstance(){
return s;
}//向外提供本类对象。
}
例如A程序和B程序,A程序判断完s==null,cpu切换到另一程序,A程序挂起;接着cpu开始执行B程序,B程序判断完s==null,cpu又切换到另一程序,B程序挂起。等到A程序恢复执行,则建立一个对象s,接下来当B程序开始执行,B又会进行创建对象s,由于这是单例设计,所以这里两个对象会冲突报错,产生安全问题。
懒汉式程序示例:
class Single{
private Single(){}
private static Single s=null;
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){
s=new Single();
return s;
}
}
}
}//向外提供本类对象。
}