------- android培训、java培训、期待与您交流! ----------
static:静态修饰符关键字
用法:是一个修饰符,用于修饰成员(成员变量,成员方法)当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员。static的特点
1.随着类的加载而加载,也就是说静态会随着类的消失而消失,说明它的生命周期最长
2.优先于对象存在明确一点,静态先存在,对象后存在
3.被所有对象所共享
4.可以直接被类名所调用
实例变量和类变量的区别
1.存放位置
类变量随着类的加载而存在于方法区中
实例变量随着对象的建立存在于堆内存中
2.生命周期
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失。
静态的使用:
什么时候定义静态变量呢?
当对象中出现共享数据时,该数据被静态所修饰。
与构造代码块的区别是什么呢?
主要是优化内存,构造代码块使每个对象都创建相同的成员变量、成员方法
什么时候定义静态方法呢?
当功能内部没有访问到非静态数据(对象的特有数据)那么该功能可以定义成静态的。
静态使用注意事项
1.静态方法只能访问静态成员,非静态方法即可以访问静态也可以访问非静态
2.静态方法中不可以定义this、super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this
3.主函数是静态的,我们才能使用静态
<span style="font-size:14px;">class Person3
{
String name;
static String country ="CN";
public void show()
{
System.out.println(name+"::"+country);
}
public static void greet()
{
System.out.println(“你好!”);
}
}
class Person3Demo
{
public static void main(String[] a)
{
Person3 p=new Person3();
p.name="xiaoming";
p.show();//对象调用非静态方法
System.out.println(Person3.country);//类名直接调用静态成员变量
<span style="white-space: pre;"> </span>Person3.greet();//类名直接调用静态方法
}
}</span>
this关键字:
代表它所在方法所属对象的引用。简单说:哪个对象在调用this所在方法,this就代表哪个对象
this的应用:
1、通过this调用本类中另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用,而且this语句要放在构造方法体中第一行。
2、方法参数或者方法中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错。
3、在函数中,需要引用该函所属类的当前对象时候,直接用this。
<span style="font-size:14px;">class Person
{
private String name;
private int age;
Person(String name)//形式参数和实际参数同名方便阅读代码,知道要传输的参数意义
{
this.name=name;//假如参数为(String name1),则可以写为name=name1这就不需要this
}
Person(String name,int age)
{
this(name);//相当于调用Person(String name)构造函数,实现名字初始化增加代码复用
this.age=age;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person("liwei");
Person p1=new Person("xiaoming",10);
}
}</span>
super关键字:
Super语句主要用于子类对象访问父类中被屏蔽或者覆盖的成员变量、方法及构造函数。与this语句相似,区别在于,this访问的是本类中被屏蔽或者重载的的成员变量、方法及构造函数。
super的应用:
1、通过super调用父类中个构造方法,用法是super(参数列表),只能用于构造方法体中,且必须置于第一行,this(参数列表)也是放第一行,所以在同一个构造方法体中两者只能用其一。
2、子类中成员变量与成员方法与父类中成员变量、成员方法同名时,父类的成员变量、成员方法被覆盖,要访问父类的成员变量、成员方法就用用到了super语句,用法为super.成员变量、super.成员方法(参数)。当然没被覆盖可以直接调用,不需要super。
class Tel
{
int number;
Tel(int number)
{
this.number=number;
}
void show()
{
System.out.println("Tel:"+number);
}
}
class NewTel extends Tel
{
int number;//与父类成员变量同名,父类成员变量被覆盖
String name;
NewTel(int number,String name)
{
super(110);//调用父类构造函数,只有将父类进行初始化,子类才能继承父类的相关数据
this.number=number;//子类对象初始化
this.name=name;//子类对象初始化
}
void show()
{
super.show();//调用父类方法
System.out.println(name+":"+number+",Tel:"+super.number);//输出子类name、number以及调用父类成员变量number
}
}
class TelDemo
{
public static void main(String[] args)
{
Tel t=new Tel(110);
NewTel nt=new NewTel(120,"急救");
t.show();
nt.show();
}
}