this
当成员变量和局部变量重名,可以用关键字this来区分。
this:代表当前对象(本类对象)。(哪个对象调用this所在的函数,this就代表哪个对象)
this必须放在函数里。
class ConsTest02
{
public static void main(String[] args)
{
Person p = new Person(); //创建第一个对象,调用相应的初始化构造函数
p.speak();
Person p1 = new Person("东东"); //创建第二个对象,调用相应的初始化构造函数
p1.speak();
p1.setName("花花"); //可以重复调用Person类中一般函数
p1.speak();
Person p2 = new Person("小黑",3); //创建第三个对象,调用相应的初始化构造函数
p2.speak();
}
}
class Person //定义一个描述人属性的类
{
private String name; //将属性私有
private int age; //将属性私有
Person () //提供公共借口方法
{
name = "baby";
age = 1;
}
Person (String name) //相同的函数名,但是不同的参数类型或者参数个数
{
this.name = name; //当成员变量与局部变量重名,用this关键字来区分。this代表当前对象。
}
Person (String name,int age) //相同的函数名,但是不同的参数类型或者参数个数
{
this.name = name; //当成员变量与局部变量重名,用this关键字来区分。this代表当前对象。
this.age = age;
}
public void setName(String name) //一般方法,可重复调用多次,进行不同的参数赋值
{
this.name = name;
}
public void speak() //创建一个函数描述动作
{
System.out.println(name+"...."+age);
}
}
构造函数可以调用构造函数。(可以用this来调用构造函数) this(); 注意:只能定义在构造函数的第一行,因为初始化动作要先执行。
构造函数可以调用一般方法。
一般方法不能调用构造函数。
————————————————————————————————————
static (静态)关键字 (共享数据,修饰的是多个对象相同的成员变量)
被static修饰的成员能被所有对象共享。成为共享数据。除了可以被对象使用。还可以被类名调用,格式:(类名 . 静态成员)。
static关键字的特点:(可以修饰成员变量,还可以修饰成员方法)
a/ 随着类的加载而加载
b/ 优先于对象存在
c/ 被类的所有对象所共享。(如果某个成员变量(或方法)是被所有对象共享的,那么就定义为静态的)
d/ 可以通过类名调用。也可以通过对象名调用。
推荐使用类名调用。静态修饰的内容一般我们成其为:与类相关的,类成员。
static关键字的注意事项:
a/ 在静态方法中没有this关键字。(因为静态随着类的加载而加载,比对象先存在,无法访问后来的对象)
b/ 静态方法只能访问静态的成员变量和静态的成员方法。(非静态既可以访问静态,又可以访问非静态)
c/ 主函数是静态的
范例:
class StaticTest
{
public static void main(String[] args)
{
Person p = new Person();
System.out.println(p.country); //static修饰的成员,可以被对象调用
System.out.println(Person.country); //static修饰的成员,可以被类名调用
}
}
class Person
{
String name;
static String country = "CN"; //被static修饰的数据能被所有对象共享
}
上面代码中:
String name; //成员变量,实例变量
static String country = "CN"; //静态变量
成员变量和静态变量的区别:
1/成员变量属于对象,成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量属于类,静态变量随着类的加载而存在,随着类的消失而消失。
2/调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3/成员变量——实例变量
静态变量——类变量
4/成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区中,所以也叫对象的共享数据。
什么时候使用static静态?
1/静态变量
当分析对象中所具备的成员变量的值都是相同的。这时这个成员就可以被静态修饰。
只要数据在对象中都是不同的,那就是对象的特有数据,必须存储在对象中,是非静态的。
如果是相同的数据,对象不需要做修改,只需要使用,不需要存储在对象中,
2/静态函数
函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。如果访问特有数据,则不能静态。
从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
如果不需要,就可以将该功能定义成静态的。
——————————————————————————————————————————————
静态代码块
随着类的加载而加载,并执行,且只执行一次。
用于给类进行初始化。
class StaticTest01
{
public static void main(String[] args)
{
StaticCode.show(); //类名.本类方法
}
}
class StaticCode
{
static int num;
static //静态代码块,给类进行初始化
{
num = 10;
}
static void show()
{
System.out.println(num);
}
}
——————————————————————————————————————————————————
main 主函数
public static void main(String[ ] args)
主函数格式是固定的,被jvm所识别和调用。
public 权限必须是最大的。
static 虚拟机调用主函数时不需要对象。直接用主函数所属类名调用即可。
void 主函数没有具体的返回值。
main 函数名,不是关键字。一个jvm识别的固定名字。
String[ ] args 主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。