黑马程序员——面向对象2

来源:互联网 发布:2015文化产业数据 编辑:程序博客网 时间:2024/05/16 17:48

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------


01

(static静态关键字)
1、static用法:修饰符,用于修饰成员(变量与函数)
2、static特点:随着类的加载而加载,随着类的消失而消失,生命周期最长。
   优先于对象存在,静态先存在,对象后存在
   被所有对象所共享
   可以直接被类名调用
3、static声明的对象:存在于方法区或者称为共享区或者称为数据区
4、静态的使用注意事项:
                   1、静态方法只能访问静态成员
                      非静态方法既可以访问静态也可以访问非静态
                   2、静态方法中不可以定义this,super关键字。
                      因为静态优先于对象的存在,所以静态方法中不可以出现this。
5、静态利弊:节省空间,可以被类名直接调用;生命周期过长,访问出现局限性。
6、主函数必须用静态
class Person
{
    String name;//成员变量,实力变量
/*static修饰的成员将不再对内存中,而是独立开辟一块空间,每个对象都可以对其访问。做到节约空间*/
    static String country="CN";//静态成员变量,类变量
    public void show()
    {
        System.put.println(name+":::"+country);
    }

}


class StaticDemo
{
    public static void main(String[] arge)
    {
        System.out.println(Person.country);//被static修饰的成员可以直接用类名.成员来调用
    }
}




02
(main函数)
固定格式public static void main(String[] args)
主函数是一个特殊的函数,作为程序的入口,可以被jvm调用
主函数的定义:
public:代表该函数访问权限最大
static:代表主函数随着类的加载就已经存在了
void:代表主函数没有返回值
main:不是关键字,但是是一个特殊的单词,可以被jvm识别。
(String[] args):函数的参数,参数类型数组。
jvm调用主函数时,传入的事new String[0]一个没有任何长度的数组。




03
(静态什么时候使用)
注意:对象的使用时为了封装数据,对象建立没有使用数据,没有建立对象的意义。
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在与对内存中。
当功能内部没有访问到静态数据,那么该功能可以定义成静态的。




04 
(静态的应用—工具类)
class ArrayTool
{
    private ArrayTool(){}//防止被建立对象
    public static int getMax(int[] arr)
    {
        int max=0;
        for(int x=1;x<arr.length;x++)
        {
            if(arr[x]>arr[max]])
            max=x;
        }
        return arr[max];
    }


    public static void selectSort(int[] arr)
    {
        for(int x=0;x<arr.length-1;x++)
            {
                for(int y=x+1;y<arr.length;y++)
                {
                    if(arr[x]>arr[y])
                    {
                        swap(arr,x,y);
                    }
                }
             }
    }


    public static void bubbleSort(int[] arr)
    {
        for(int x=0;x<arr.length-1;y++)
        { 
            for(int y=0;y<arr.length-x-1;y++)
            {
                if(arr[y]>arr[y+1])
                {
                    swap(arr,y,y++);
                }
            }
        }
    }


    private  static void swap(int[] arr,int a,int b)//私有化,只供内部使用
    {
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b=temp;]
    }
}


对象用于封装数据,可是ArrayTool的对象并未封装特有的数据。
操作数组中的每一个方法都没用到ArrayTool对象中特有的数据。
可以将array中的方法都定义成static,直接通过类名调用即可。
将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象的。
为了更为严谨,强制让该类不能建立对象。可以通过将构造函数私有化完成。
class ArrayToolDemo
{
    public static void main(String[] args)
    {
        int[] arr={3,6,8,9,2,5};
        int max=ArrayTool.getMax(arr);
        System.out.println("max=+max")
/*ArrayTool tool=new ArrayTool();
int max=tool.getMax(arr);
System.out.println("max=+max")*/

    }
}


06
(静态代码块)
格式:
static
{
    静态代码块中的执行语句
}
特点:随着类的加载而执行,值执行一次,并优先于主函数。
用于给类进行初始化


class StaticCode
{
    int num=9;
    StaticCode()
    {
        System.out.println("b");
    }

    static
    {
        System.out.println("a");
//静态代码块只能调用静态成员
//System.out.println("a"+num);
     }
     {
        System.out.println("c"+this.num);
     }
    StaticCode(int x)
    {
        System.out.println("d");
    }
    public static void show()
    {
        System.out.println("show run");
    }

}


class StaticCodeDemo
{
     public static void main(String[] arge)
    {
        new StaticCode(4);
    }
}
执行结果为a c9 d。创建了对象,有加载类。所以调用静态代码块。有创建对象,则调用构造代码块。






07
(对象的初始化过程)
Person p=new Person("zhangsan",20);
这句话都做了以下事情:
1、因为new用到了Person.class,所以会先赵大鹏Person.class文件并家寨到内存中。
2、执行该类中的static代码块,如果有,给Person.class类进行初始化。
3、在对内纯中开辟空间,非配内存地址。
4、在堆内存中建立对象的特有属性。并进行默认初始化。
5、对属性进行显性初始化。
6、对对象进行构造代码快初始化。
7、对对象进行对应的构造函数初始化。
8、将内存地址赋给栈内存中的p变量。




09、10
(单例设计模式)
设计模式:解决某一类问题最行之有效的方法。
java中23种设计模式:单例设计模式。解决一个类在内存中只存在一个对象
想要保证对象唯一:
1、为了避免其他程序过多建立该类的对象。先静止其他程序建立该类的对象(将构造函数私有化)
2、还为了让其他程序可以访问到该类的对象,只好在本类中自定义一个对象(在类中创建一个本类对象)
3、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(提供一个方法可以获取到该对象)




饿汉式:Single类一进内存,就已经创建好了对象
class Single
{
    privait static single s=new Single();
    private Single(){}
    private Single getInstance()
    {
        return s;
    }
}


懒汉式:对象时方法被调用时,才初始化,也叫做对象的延时加载。
class Single
{
    private static Single s=null;
    private Single(){}
    public static Single getInstance()
    {
        if(s==null)
        s=new Single();
        return s;
    }
}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------




0 0
原创粉丝点击