黑马程序员 java _private static this关键字 main方法 单例设计模式
------- android培训、java培训、期待与您交流! ----------
1. private关键字
private关键字:
是一个权限修饰符。
用于修饰成员(成员变量和成员函数)
被私有化的成员只在本类中有效。
常用之一:
将成员变量私有化,对外提供对应的set ,get方法对其进行访问。提高对数据
访问的安全性。
2. static关键字
static表示静态,是一个修饰符,用于修饰累的成员(变量,方法)。当成员被static修饰后,
成员除了 被对象调用外,还可以被类调用。
格式为:类名.静态成员。
要调用成员变量i时,不需要创建对象,可以通过类名直接调用:StaticTest.i。
static的特点:
a、随着类的加载而加载,随着类的消失而释放;
b、优先于对象而存在;
c、被所有对象共享;
d、可以直接被类名调用;
在类中普通成员变量可以被称为实例变量,静态修饰的成员变量称为类变量。
类变量与实例变量的区别:
a、存放位置:类变量随着类的加载而存在方法区中;
而实例变量时随着对象的建立而存在内存中。
b、生命周期:类变量生命周期最长,随着类的消失而消失;
实例变量随着对象的消失而消失。
另外static修饰的代码块即静态代码块也是随着类的加载而执行,只执行一次,
用于给类进行初始化。静态方法不能访问非静态成员。
静态有利有弊总结
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中
都存储一份。
可以直接被类名调用。
弊端:生命周期过长。
访问出现局限性。(静态虽好,只能访问静态。)
使用注意
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
3. this关键字
特点:this代表其所在函数所属对象的引用。
换言之:this代本类对象的引用。
什么时候使用this关键字呢?
当在函数内需要用到调用该函数的对象时,就用this。
class Person
{
private String name;
private int age;
Person(int age)
{
this.age = age;//将实参age的值赋予Person的成员age,this代表本类 //对象的引用,指向调用此构造方法的Person对象
}
Person(String name)
{
this.name = name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public void speak()
{
System.out.println("name="+this.name+"...age="+this.age);
this.show();
}
public void show()
{
System.out.println(this.name);
}
/*
需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
*/
public boolean compare(Person p)
{
return this.age==p.age;
}
}
4. main方法
主函数:是一个特殊的函数。作为程序的入口,可以被jvm调用。
主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被jvm识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。
字符串类型的数组。
主函数是固定格式的:jvm识别。
jvm在调用主函数时,传入的是new String[0];
class MainDemo
{
public static void main(String[] args)//new String[]
{
//打印0,说明jvm在调用主函数时,传入的是new String[0];
System.out.println(args.length);
}
}
也可以自定义数组arr,然后出入main方法
class MainDemo
{
public static void main(String[] args)//new String[]
{
String[] arr = {"hah","hhe","heihei","xixi","hiahia"};
//向MainTest的main方法中传入数组arr
MainTest.main(arr);
}
}
class MainTest
{
public static void main(String[] args)
{
for(int x=0; x<args.length; x++)
System.out.println(args[x]);
}
}
5. 单例设计模式
单例设计模式是static的一个扩展应用。
设计模式:解决某一类问题最行之有效的方法。
单例设计模式:解决一个类在内存只存在一个对象。
想要保证对象唯一,必须执行下面三个步骤。
a,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
b,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
c,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
这里介绍两个单例设计模式:饿汉式和懒汉式。
饿汉式
这个是先初始化对象。
Single类一进内存,就已经创建好了对象。
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
懒汉式
对象是方法被调用时,才初始化,也叫做对象的延时加载。
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}
在懒汉式中使用了同步锁,并且进行了双重判断,虽然能够保证线程安全,但是这样比较消耗资源,所以建议使用饿汉式。