黑马程序员---java基础---this、static关键字

时间:2021-08-24 11:47:41
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



《this  关键字》


· this 存在于一个(定义在类里的)方法里边,<this.成员变量>  指的是当前调用这个方法的对象。通过 <this.成员变量> 修改当前对象的变量值
· his的值是一个指针(引用),代表当前调用这个方法的对象本身。

· static 定义的方法不能用 this, 因为 static 方法是属于类的 而不是属于对象的方法 。

· 在一个类中使用其成员(属性、方法)时,都默认使用 <this.成员>的格式,自己不显示的写明,编译器也会添加


public class Leaf
{
int i = 0; // 变量的作用域起始于定义它的 左{ 开始,与之配对的 右} 结束。
Leaf(int i)
{
this.i = i;
}

Leaf increa() //返回值类型为 Leaf 的引用
{
i++;
return this;// this == leaf 两者的 hashcode 一样
}// 两者 hashcode 也一样, 理论上可以相互替换

void print()
{
System.out.println("i = " + i);
}

public static void main(String[] args)
{
Leaf leaf = new Leaf(100);
leaf.increa().increa().print(); // 输出结果 i = 102
// System.out.println(i); // 错误:无法在这里(static main())引用非静态变量 i;
}
}


>> 使用this进行两个对象的比较

class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public boolean compare(Person per){// 调用此方法时里面存在两个对象:当前对象、传入的对象
Person p1 = this ; // 当前调用该方法的对象,用 this 就 表示per1
Person p2 = per ;// 传递进来的对象,就表示per2
if(p1==p2){// 判断是不是同一个对象,用地址比较
return true ;
}
// 之后分别判断每一个属性是否相等
if(p1.name.equals(p2.name) && p1.age==p2.age){ // 判断 age 可以直接使用 ==
return true ;// 两个对象相等
}else{
return false ;// 两个对象不相等
}
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;//这里 格式
}
public int getAge(){
return this.age ; //这里 格式
}
};
public class ThisDemo{
public static void main(String args[]){
Person per1 = new Person("张三",30) ;
Person per2 = new Person("张三",30) ;
// 直接在主方法中依次取得各个属性进行比较
if(per1.compare(per2)){
System.out.println("两个对象相等!") ;
}else{
System.out.println("两个对象不相等!") ;
}
}
};

《static关键字》

1).  
  
     在类中,用 static 声明的成员变量为静态成员变量,它为该类的公用变量(属于整个类,而不是 属于对象,只开辟一块空间)
     在第一次使用时被初始化(0、null、false),  对于该类所有的成员来说,static 成员变量只有一份;对于非 static 的成员变量,
     每次new 一个对象就有一份,而static 变量只有一份,而且所有对象共享这个 static 变量。
     static 变量存放在 data segment,而不是存在于 heap;                              

     对于非 static 变量,该变量属于对象,没有 new 对象 就不可以访问该变量。


2). 
static 方法

        。用 static 声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它, 所以在 static 方法中
  不可以访问非 static 成员,

。static 方法不再是针对于某个对象调用,所以不能访问非静态成员。而且对于 static声明的方法 并不需要对象来调用,
    可以直接使用  类名.static方法名(参数列表)  的方式来调用(该static方法中不可以有非static成员)。

。非 static 方法可以访问 static 成员(方法和变量),static方法 不可以访问 非static 成员,因为 非static 成员
必须有对象被创建才能访问,而 static成员 属于类 可以直接用 classname. 的方式来访问
                   
。 非静态方法必须创建对象才能访问非静态成员。静态方法可以不创建对象,直接访问静态成员,也可以通过创建对象来访问。

。static成员 随着类的产生而产生,而 非static成员 只有产生了对象才会产生,如果没有创建对象,则 非static 成员在内存中不存在,

。static方法中不可以有 this、super 关键字,

3).

?什么时候需要定义 static 变量

    。当对象中出现共享数据(而非属性)时,该数据被修饰为 static, 对象中的特有数据要定义成非静态

?什么时候需要定义 static 方法

    。当方法内部没有访问到非静态数据
    

4).

   static 变量 与 非static 变量的比较:

对于 static 变量,所有对象共用一块空间,一个对象的 static 变量改变,别的也跟着改变。 类名.static变量  这种格式的 static变量 的改变
也会导致别的对象的 static 变量改变,共用一块空间。

public class Test1
{
static int j;

public static void main(String[] args)
{

Test1.j = 100;
Test1 test1 = new Test1();
Test1 test2 = new Test1();
test1.j = 111;
test2.j = 222;
System.out.println("test1:j= " + test1.j); //222
System.out.println("test2:j = " + test2.j); //222
System.out.println("Test1:j = " + Test1.j); //222
test1.j = 555;
test2.j = 444;
Test1.j = 333;
System.out.println("test1:j= " + test1.j); //333
System.out.println("test2:j = " + test2.j); //333
System.out.println("Test1:j = " + Test1.j); //333


}
}