黑马程序员-Java-this关键字

时间:2021-07-24 00:43:23
<pre name="code" class="java"> 坚持笔记9-11
<1.this关键字
this在java中表示出以下的概念:
调用类中的属性
调用类中的方法
调用类中的构造方法:this()
表示当前的对象 this
范围
class Person{
private String name;
private int age;
public Person(String n,int a){
this.setName(n);
this.setAge(a);
}
public void setName(String n){
this.name=n;
}
public void setAge(int a){
this.age=a;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class Text{{
public static void main(String []args){
Person per=new Person("张三",30);
System.out.println(per.name()+"-->"+per.getAge());
}
}
****************
class Person{
private String name;
private int age;
public Person(){
System.out.println("新对象产生了");
}
public Person(String name){
// System.out.println("新对象产生了");
this.();//必须放在首行
this.name=name;
}
public Person(String name,int age){
// this.setName(name);
this.(name)//必须放在首行
this.setAge(age);
// System.out.println("新对象产生了");
}
public void setName(String n){
this.name=n;
}
public void setAge(int a){
this.age=a;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class Text{{
public static void main(String []args){
Person per=new Person("张三",30);
System.out.println(per.name()+"-->"+per.getAge());
}
}
//this带哦用构造方法的时候,至少有一个构造方法是没有调用构造方法的,而次构造方法将作为调用的出口
//
用this l来表示对象
package dom;
class Person {
public void print (){
System.out.println(this);
}
}
public class Text1{
public static void main(String[]args){
Person per1=new Person();
Person per2=new Person();
System.out.println(per1);
per1.print();
System.out.println(per2);
}
}


class A{
   private B b=null;
   public void fun(){
      this.b=new B(this);
      this.b.fun();
   }
   public void print(){
      System.out.println("Hellow word!!");
   }
}
class B{

   private A a =null;
   public B(A a){
      this.a =a;
   }
   public void fun(){
      this.a.print();
   }
}
public class Text1{
   public static void main(String[]args){
 

      new A().fun();
   }
}



NO

比较点

this

Super

1

属性

This属性表示的是本类中的属性,如果在子类中找不到属性则会从父类中继续查找

Super 属性,表示直接找到父类中的属性

2

方法

This 方法()表示调用本类中的方法

表示从子类中调用找到被子类覆写过的方法

3

构造

可以调用本类中的其他构造方法,但是要求至少有一个没有this()
调用构造时this()放在构造方法之前

从子类中调用副类的构造方法,字类不管如何写代码,都要先调用父类中的构造方法
调用构造时this()放在构造方法之前

4

特殊

This 表示当前的对象

无次概念






/*
完成一个简单的登陆系统,
输入用户名 密码
*/
package dom;
 
public class Text1{
   public static void main(String[]args){
      String name =args[0];
      String password =args[1];
      if(name.equals("wangqi")&& password.equals("123")){
         System.out.println("登陆成功..");
      }

      else {
         System.out.println("灯笼失败..");
      }
   }
}
为程序加入验证、
package dom;
 
public class Text1{
   public static void main(String[]args){
      if (args.length!=2){
         System.out.println("参数输入不够");
         System.exit(1);
      }
      String name =args[0];
      String password =args[1];
      if(name.equals("wangqi")&& password.equals("123")){

         System.out.println("登陆成功..");
      }
      else {
         System.out.println("灯笼失败..");
      }
   }
}
第一次封装
package dom;
class Check{
   private String args[];
   public Check(String []args){
      this.args=args;
   }
   public boolean valuable (){
      String name =this.args[0];
      String password =this.args[1];
      if(name.equals("wangqi")&& password.equals("123")){
         System.out.println("登陆成功..");
         return true;
      }
      else {
         System.out.println("灯笼失败..");
         return false ;
      }
   }
}
public class Text1{
   public static void main(String[]args){
      if (args.length!=2){
         System.out.println("参数输入不够");
         System.exit(1);

      }
      new Check(args).valuable();
   }
}
第二次封状
/*
完成一个简单的登陆系统,
输入用户名 密码
*/
package dom;
class Check{
   private String name;
   private String password;

   public Check(String name,String password){
      this.name=name;
      this.password=password;
   }
   public boolean valuable (){
      if(name.equals("wangqi")&& password.equals("123")){
         return true;
      }
      else {
         return false ;
      }

   }
}
class Before{
   private String args[];
   public Before(String args[]){
      this.args=args;
      if (args.length!=2){
         System.out.println("参数输入不够");
         System.exit(1);
      }
   }
   public String getInfo(){
      if (new Check(this.args[0],this.args[1]).valuable()){
         return "登陆成功..";
      }
      else{
         return "登陆失败..";
      }
   }

}
public class Text1{
   public static void main(String[]args){
      System.out.println(new Before(args).getInfo());
   }
}
 黑马程序员-Java-this关键字
 


<2.static
 package dom;
class Person{
   private String name;
   private int age ;
   String city=" A .";
   public Person(String name,int age ){
      this.name=name;
      this.age =age;
      }
   public String getInfo(){
      return "姓名:"+this.name +",年龄"+this.age+",城市"+city;
   }
}
public class Text1{
   public static void main(String[]args){
      Person per1=new Person("张三",30);
      Person per2=new Person("李四",30);
      Person per3=new Person("王五",30);
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());

   }
}
不足点:
   City属性表示的信息都是一样的,所以对各个类对象讲重复了
   如果现在假设将城市更名为B城市 并且此类产生了5000次要修改5000次,最好的解决办法是 将city修改成属性
   会需要Static 关键子
 package dom;
class Person{
   private String name;
   private int age ;
   static String city=" A 城.";
   public Person(String name,int age ){
      this.name=name;
      this.age =age;
      }
   public String getInfo(){
      return "姓名:"+this.name +",年龄"+this.age+",城市"+city;

   }

}

public class Text1{
   public static void main(String[]args){
      Person per1=new Person("张三",30);
      Person per2=new Person("李四",30);
      Person per3=new Person("王五",30);
      System.out.println("信息修改之前..");
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
      per1.city=" B ";
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
   }
}
黑马程序员-Java-this关键字
 


  一般情况下对于使用static 声明的属性都使用类名直接调用
类名程 static 属性
  所以,以上的操作代码修改城市属性应该由Person 完成
Person.city=” B城 
public class Text1{
   public static void main(String[]args){
      Person per1=new Person("张三",30);
      Person per2=new Person("李四",30);
      Person per3=new Person("王五",30);
      System.out.println("********信息修改之前******");
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
      Person.city=" B ";
      System.out.println("********信息修改之后******");
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
   }
}
黑马程序员-Java-this关键字 

Ststic 除了可以声明属性外还可以定义方法 ,使用Static 定义的方法可以由类名称直接调用
package dom;
class Person{
   private String name;
   private int age ;
   private static String city=" A .";
   public Person(String name,int age ){
      this.name=name;
      this.age =age;
   }
   public static void setCity(String c){
      city=c;
   }
   public String getInfo(){
      return "姓名:"+this.name +",年龄"+this.age+",城市"+city;
   }
}

public class Text1{
   public static void main(String[]args){
      Person per1=new Person("张三",30);
      Person per2=new Person("李四",30);
      Person per3=new Person("王五",30);
      System.out.println("********信息修改之前******");
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
      Person.setCity(" B ");
      System.out.println("********信息修改之后******");
      System.out.println(per1.getInfo());
      System.out.println(per2.getInfo());
      System.out.println(per3.getInfo());
   }
}
在使用静态方法的时候需要注意以下的几个方面
   静态属性和方法可以在没有实例化的时候调用
   而类中的普通方法和普通属性,肯定只有在对象的实例后才有可能调用。
   public static void setCity(String c){
      city=c;
      this.name=name;
      this.age =age;
   }
在之前我门讲过想在主方法里直接调用方法
package dom;
public class Text1{
   public static void main(String[]args){
      fun();
   }
   public static void fun(){
      System.out.println("Hello Word !!");
   }
}
package dom;
public class Text1{
   public static void main(String[]args){
      new Text1.fun();
   }
   public void fun(){
      System.out.println("Hello Word !!");
   }
}
 
关于主方法:
  Public static void main(){}
      Public :表示最大的访问权限
      Static :因为执行的时候执行的就是类名,表示雷鸣可以直接调用
      Void :  因为主方法是一个起点,所以表示没有返回值得类型
      Main :系统的内建方法名称
      String []args 表示字符串,有系统参数
package dom;
public class Text1{
   public static void main(String[]args){
      for(int i=0 ;i<args.length ;i++ ){

         System.out.println(args[i]);

      }

   }

}

/*
   java Text1 jhgjk sdfds dsf dsf
   :\java>java ddfg fdfg dfgdfg
   hiuwhi
   erfer
   rw
   "hello word "表示一个参数
*/
  堆内存:对象名称
  栈内存:属性
  全局代码区:保存所有操作方法

全局数据区:保存所有Static 属性