this
1.this修饰成员变量
编译器的就近赋值原则
打破就近匹配原则,使用this.属性名称,直接从类中寻找同名变量。
2.this修饰方法
2.1 修饰成员方法,表示调用类中成员方法
语法:this.方法名称
- 同一个类中,加不加都可以;
- 当有继承关系之后,明确调用的是当前类的成员方法,则就需要加上this.方法名称。
2.2 this 调用构造方法
语法:this(参数);//表示调用构造方法
构造方法之间可以调用,
- this的构造方法调用必须写在构造方法首行
- this的构造方法不能成环
构造方法是为了产生对象,对象产生时构造方法进行调用
- 成员方法中能否调用构造方法?
不能。构造方法只能通过产生对象时由编译器自动调用。 - 构造方法之间能否互相调用?
可以。一组构造方法就是为了不同成员变量赋值的,可以互相调用。
3. this表示当前对象引用
当前是通过哪个对象来调用的方法或属性,this就指代谁
static关键字(看见static关键字,和对象无关)
1. static修饰属性,称之为类属性,静态属性,存放在JVM的方法区;
- static表示静态,与类相关,和具体对象无关
- 当某个类的所有对象对于某一个属性,大家的属性值都相同,该属性就应该设计为类属性,和类强相关,和具体的对象无关,比如country属性。
- 要在类中定义类属性,使用static关键字
- country 变成类属性,通过类名称直接调用,不需要通过具体对象调用。
java中所有方法的内部不能定义静态变量!!!
原因:在有对象调用的内部(成员方法)产生了一个没有对象就能调用的静态变量(静态变量)—错误(编译出错)
举例:
class Janpanse{
String name;
int age;
//类属性,和对象无关,可以通过类名直接进行调用
static String country="日本";
}
main()
{
Japanses j1=null;
j1.country="中国";//会不会抛出NPE异常?
sout(Japanses.country);//是否正确?
}
问题1:会不会抛出NPE异常?
不会。相当于直接通过类名调用country属性。
- 虽然j1不指代任何Japanses的对象,但是j1仍然是Japanese类的引用。
- 引用值为null时,只有调用成员方法或者成员变量才会抛出NPE异常,使用静态方法或者静态变量时不会报错。
问题2:是否正确?
正确。通过类名称直接调用。
2. static修饰方法----类方法,直接通过类名称调用,和对象无关
一个类的工具方法一般设计为静态方法,与具体的对象无关
3.static修饰的静态域(静态属性、静态方法)和成员域(成员属性和成员方法)之间的关系
-
能否在静态方法中调用成员方法或者成员变量?
不行。不能在任何的静态域中访问成员域(方法、属性)
静态方法–没有对象
成员方法–必须通过对象调用 -
在成员方法中能否调用静态属性或静态方法?
可以但不推荐。一般可以直接通过类名称来访问静态对象。
成员方法–有对象需要调用
静态方法–没对象都可以调用
4. static 关键字能否直接修饰一个类?
- 无法直接修饰外部类,但是可以修饰内部类。
外部类:直接在源文件中定义的类
内部类:一个类嵌套在另一个类的内部
5.静态static 变量的初始化问题
构造方法一般初始化的都是成员属性,构造方法是产生对象时为对象初始化的。
静态变量一般就地初始化或者在静态代码块中初始化
5.1 就地初始化
5.2 静态代码块初始化
代码块:使用{}定义的一段代码成为代码块。根据代码块出现的位置及关键字的不同,分为以下四种:
-
普通代码块
直接定义在方法内部,不加任何修饰符定义的代码块称为普通代码块=>解决变量重名问题
-
构造块
定义:直接定义在类中,使用{}的代码块称之为构造块。
特点:每当产生对象时就会默认调用构造块,构造块优先于构造方法执行。
public class CodeSquare{
public CodeSquare()
{
system.out.println("1.无参构造");
}
{
system.out.println("2.构造块")
}
public static void main(String[] args)
{
CodeSquare c1=new CodeSquare();
CodeSquare c2=new CodeSquare();
}
}
多个构造块则会按照书写顺序从上至下依次执行,但是统一都在构造方法之前执行。
(最后编译都会将构造块的代码写入到构造方法之中)
- 静态代码块
定义:使用static关键字修饰,直接定义在类中的代码块称为静态代码块。一般用于初始化静态变量 ,静态块优先于构造块执行。
特点:静态块在类加载时执行一次,和具体产生对象无关,若有多个静态块,则按照代码的书写顺序依次执行。
普通静态代码块:
class Demo{
static int i;
public Demo()
{
System。out.println("1.无参构造");
}
{
System。out.println("2.构造块");
}
static{
i=10;//对静态变量进行初始化
//当Demo类被加载到JVM时自动执行,且只执行一次
System。out.println("3.静态块");
}
}
主类中的静态代码块
– 主类中的静态代码块还会优先于主方法执行。
– main存在于主类中,要执行主方法首先得将主类加载到JVM中,当主类被加载,主类中的静态块就会自动执行。
- 同步代码块(多线程部分:使用关键字synchronized修饰的代码块成为同步块)
笔试题:
结果为:2
静态代码块中的局部变量和静态类变量没有任何关系。
去掉int
的区别:
总结
this:表示当前对象的引用,和具体的对象相关
-
this修饰属性表示直接从类中寻找同名的成员变量。
-
this修饰方法
- 修饰普通成员方法。this.方法名称(参数);
- 修饰构造方法。this(参数);
this构造方法必须写在构造方法的首行,且不能成环。
-
this可以表示当前对象引用,当前是通过哪个对象调用属性或方法,this就指代谁。
static:与具体的对象无关,和类本身相关
- static修饰的属性称为类属性,与对象无关,和类本身相关,该类的所有对象共享此属性。在JVM的方法区保存静态变量。
- static修饰的方法称为类方法,一般将工具类方法设置为静态方法,与对象无关。
eg: Math.math(a,b);Array.sort(num);