static&&this

  • static 静态的

  • 所有static修饰的类都是类级别的。

  • 所有static修饰的都是采用类名.方式访问。

  • static修饰的方法:静态方法

  • static修饰的变量:静态变量

  • 变量分为:局部变量和成员变量

  • 成员变量分为:实例变量和静态变量

  • class VarTest{
      //需要对象的参与,可能出现空指针异常
      int i;
      public void m2(){
      
      }
      //以下不需要对象参与即可访问,没有空指针异常问题
      static int k;
      public static void m1(){
      
      }
    }
    
  • //什么时候声明为实例,什么时候声明为静态
    public class StaticTest{
      public static void main(String[] args){
              Chinese c1 = new Chinese("11","张三","中国");
              Chinese c1 = new Chinese("11","李四中国");
      }
    }
    
    class Chinese{
      //身份证号
      String idCard;  //一个对象一份,每个人的身份证号不同
      //姓名
      String name;    //一个对象一份,一个人一个姓名
      //国籍
      String country;//对于此类来说,不会随对象改变。是整个类的特征。
      
      public Chinese{
      
      }
      public Chinese(String s1,String s2,String s3){
          idCard = s1;
                  name = s2;
                  country = s3;
      }
    }
    
image.png

image.png
//什么时候声明为实例,什么时候声明为静态
//如果这个类型的所有对象的某个属性都是一样的,不建议定义为实例变量,浪费内存空间,建议使用定义为static
public class StaticTest{
    public static void main(String[] args){
            Chinese c1 = new Chinese("11","张三");
            Chinese c1 = new Chinese("11","李四");
    }
}

class Chinese{
    //身份证号
    String idCard;  //一个对象一份,每个人的身份证号不同
    //姓名
    String name;    //一个对象一份,一个人一个姓名
    //国籍
    static String country = "中国";//对于此类来说,不会随对象改变。是整个类的特征。
    //static默认值在类加载是初始化,不需要new对象,存储在方法区。
    
    public Chinese{
    
    }
    public Chinese(String s1,String s2){
        idCard = s1;
        name = s2;
    }
}
image.png
  • static修饰的统一都是静态的,都是类相关的,不需要new对象,直接用类名.访问。
  • 当一个属性是类级别的属性,所有对象的这个属性的值是一样的,建议定义为静态变量
public class StaticTest{
    public static void main(String[] args){
        StaticTest st = new StaticTest();
        st = null;
        st.doSome();    //这个会转换为StaticTest.doSome();
        
        st.doOther();   //空指针异常。
        
    }
    //可以使用类名.访问,也可用对象.访问(不建议)
    public static void doSome(){
        System.out.println("doSome");
    }
    //通过对象.访问
    public void doOther(){
        System.out.println("doOther");
    }
}
  • 方法什么时候实例,什么时候静态。

  • 此方法一般都是描述一个行为,如果需要对象触发则需要实例方法。

  • 静态方法只能访问静态变量。

  • 方法体中直接访问实例变量这个方法一定是实例方法。

  • 如果工具类中方法大部分是静态方法。(静态方法是不需要new对象,工具类为了方便,所以一般都是static的。)

  • public class StaticTest{
      public static void main(String[] args){
          User.getId();
      }
    }
    
    class User{
      private int id; //实例变量,需要对象
      
      private String name;    //实例变量
      
      public void printName(){
          System.out.println(name);
      }
      
      public static void setId(int i){
          id = i; //静态方法调用实例变量,错误
      }
      public static int getId(){
          return id;//静态方法调用实例变量,错误
      }
    }
    
//使用static关键字可以定义:静态代码块
//什么事静态代码块:
static {
  java语句;
}
//一个类中可以编写多个静态代码块。
//静态代码块在类加载时执行,并且只执行一次,在main之前执行,按照自上而下的顺序执行。
//静态代码块的作用:不常用;实际上是给Java程序员的一个特殊的时刻,一个时机:类加载时机。
//记录日志代码,类何时加载到JVM中?可以写到静态代码块中。
public class StaticTest{
  public static void main(String[] args){
      
  }
}
  public class StaticTest{
    //类加载时初始化
    static int i = 100;
    //类加载时执行
    static{
        System.out.println(i);
    }
    int k;
    static {
        System.out.println(k);//类加载时k还不存在,k在构造后才存在。
    }
    
    static {
        System.out.println(name);//name在后面,执行时机相同,按顺序执行,name还不存在
    }
    
    static String name = "张三";
    
    public static void main(String[] args){
        
    }
  }
  • 静态区中存放静态变量+静态片段

  • 方法执行过程需要压栈。

  • new出来的对象都在堆中。

  • Java程序要求有顺序的:

    • 对于一个方法来说,自上而下
    • 静态代码块和静态代码块有先后顺序。
    • 静态代码块和静态变量有先后顺序。
  • 实例代码块:实例语句块在构造方法之前执行,而且只有new一个对象就会在构造方法之前执行。实例代码块在类加载时并没有执行。

  • 语法:{ java语句; }

    public class InstanceCode{
      public InstanceCode(){
          System.out.println("无参");
          new InstanceCode();
      }
      {
          System.out.println("实例");
      }
      public InstanceCode(String name){
          System.out.println("有参");
      }
      public static void main(String[] args){
          System.out.println("main begin");
      }
    }
    
  • 判断程序的执行顺序

  • publci class CodeOrder{
      //静态代码块
      static {
          System.out.println("a");
      }
      //入口
      public static void main(String[] args){
          System.out.println("x");
          new CodeOrder();
          System.out.println("over");
      }
      //构造函数
      public CodeOrder(){
          System.out.println("B");
      }
      //实例语句块
      {
          System.out.println("C");
      }
      //静态代码块
      static {
          System.out.println("X");
      }
    }
    
    //a
    //X
    //x
    //C
    //B
    //over
    
  • this是一个关键字

  • this在内存方面怎样?

  • 一个对象一个this,this是一个变量,是一个引用,this指向当前对象的内存地址。

  • 从严格意义上讲,this代表的就是当前对象,this存储在堆内存当中对象的内部。

  • public class ThisTest{
      public static void main(String[] args){
          Customer c1 = new Customer("张三");
          Customer c2 = new Customer("李四");
      }
    }
    
    class Customer{
      string name;
      public Customer(){
          
      }
      public Customer(String s){
          name = s;
      }
      public void shopping(){
          System.out.println(name);
      }
    }
    
image.png
  • this只能使用在实例方法中,谁调用这个实例方法,this就是谁,所以this代表的是当前对象。

  • this大部分情况下可以省略。

  • public class ThisTest{
      public static void main(String[] args){
          Customer c1 = new Customer("张三");
          c1.shopping();
          
          Customer c2 = new Customer("李四");
          c2.shopping();
      }
    }
    
    class Customer{
      string name;
      public Customer(){
          
      }
      public Customer(String s){
          name = s;
      }
      public void shopping(){
          //这里的this是当前对象。
          //c1调用shopping,this是c1,c2调用shopping,this是c2。
          //this.省略的话,访问的还是当前对象的内容。
          System.out.println(name);
      }
      
      public static void doSome(){
          //this是代表当前对象,静态方法调用不需要对象。
          System.out.println(this);
      }
    }
    
    class Student{
      String name = "张三";
      
      public static void m1(){
          System.out.println(name);   //错误
          //this代表当前对象。
          System.out.println(this.name);//error
          
          //以下两行可以
          Student s = new Student();  
          System.out.println(s.name);
      }
      
      //如果方法中直接访问实例变量,该方法必须是实例方法。
      //this用在当前对象,静态方法不能用于当前对象。
    }
    
    public class ThisTest{
      int i = 100;
      static int k = 100;
      public static void main(String[] args){
          System.out.println(i);  //无法从静态中访问。
          
          //以下可以。
          ThisTest t = new ThisTest();
          System.out.println(i);  
          
          System.out.println(k);  //可以。
        }
    }
    
    public class Date{
      int year;
      int month;
      int day;
    }
    
  • public class Man{
          String idcard;
          String name;
          int age;
          static boolean sex = true;
          Woman w;
    }
    
  • public class Woman{
      String idcard;
          String name;
          int age;
          static boolean sex = false;
          Man m;
    }
    
  • public class Account{
      String actno;
      String password;
      double balance;
    }
    
  • public class Wechat{
      String no;
      String phone;
      String nickName;
    }
    
  • public class Last{
      public static void main(String[] args){
          //创建丈夫(还没妻子)
          Husband h = new Husband("1111","张三","1999-10-19",null);
          //创建妻子(还没丈夫)
          Wife w = new Wife("2222","李四","1999-10-10",null);
          
          //结婚
          h.w = w;
          w.h = h;
          
          System.out.println(h.name + "的妻子是" + h.w.name);
          System.out.println(w.name + "的妻子是" + w.h.name);
          
      }
    }
    
    class Husband{
          String idCard;
          String name;
          String birth;
          Wife w;
          
          public Husband(){
          
          }
          public Husband(String s1,String s2,String s3,Wife w){
              idcard = s1;
              name = s2;
              birth = s3;
              w = w;
          }
    }
    
    class Wife{
      String idCard;
      String name;
      String birth;
      Husband h;
      
      public Husband(){
          
      }
      public Husband(String s1,String s2,String s3,Husband h){
          idcard = s1;
          name = s2;
          birth = s3;
          h = h;
      }
    }
    
  • public class Homework{
      public static void main(String[] args){
          Book b = new Book("高三数学人教版",20);
          b.detail();
          
          //修改页数
          b.setPageNum(100);
          b.detail();
          
          Book b2 = new Book();
          b.detail();
      }
    }
    
    class Book{
      private string title;
      private int pageNum;
      public Book(){
          
      }
      public Book(String s,int i){
          title = w;
          if(i < 200){
              System.out.println("本书页数不能少于200页,默认赋值200");
              pageNum = 200;
              return ;
          }else {
              pageNum = i;
          }
      }
      
      public void setTitle(String s){
          title = s;
      }
      public String getTitle(){
          return title;
      }
      public void setPageNum(int i){
          if(i < 200){
              System.out.println("本书页数不能少于200页,默认赋值200");
              pageNum = 200;
              return ;
          }
          pageNum = i;
      }
      public int getPageNum(){
          return pageNum;
      }
      
      public void detail(){
          System.out.println("教程名称"+title,"总页数"+pageNum);
      }
    }
    
image.png
//this在构造方法中区分局部变量和实例变量。
public class ThisTest{
  public static void main(String[] args){
      Student s = new Student();
      s.setNo(11);
      s.setName("ag");
      System.out.println(s.no);
      System.out.println(s.name);
      
  }
}

class Student{
  //学号
  private int no;
  //姓名
  private String name;
  public Student(){
      
  }
  public Student(int no,String name){
      this.no = no;
      this.name = name;
  }
  public int getNo(){
      return no;
  }
  
  public String getName(){
      return name;
  }
  
  public void setNo(int no){
      this.no = no;   //this的作用区分局部变量和实例变量
  }
  public void setName(String name){
      this.name = name;
  }
}
  • //this除了使用在实例上,还可以使用在构造方法上。
    //通过当前的构造方法调用另一个本类的构造方法,this(实际参数列表);
    //this()的作用:代码复用。构造方法1和构造方法2都是在同一个类中。
    //this()只能出现在构造方法的第一行。
    public class ThisTest{
      public static void main(String[] args){
          Date d = new Date();
          d.detail();
          
          Date d1 = new Date(2008,8,8);
          d1.detail();
          
      }
    }
    
    class Date{
      private int year;
      private int month;
      private int day;
      
      public Date(){
          //year = 1970;
          //month = 1;
          //day = 1;
          this(1970,1,1);//与上三行一样。
      }
      
      public Date(int year,int month,int day){
          this.year = year;
          this.month = month;
          this.day = day;
      }
      
      public void setYear(int year){
          this.year = year;
      }
      
      public int getYear(){
          return this.year;
      }
      
      public void setMonth(int month){
          this.month = month;
      }
      
      public int getMonth(){
          return this.month;
      }
      
      public void setDay(int day){
          this.day = day;
      }
      
      public int getDay(){
          return this.day;
      }
      
      public void detail(){
          System.out.println(this.year);
          System.out.println(this.month);
          System.out.println(this.day);
      }
    }
    

//面向对象思想程序:

public class Homewrok{
    public static void main(String[] args){
            Account a = new Account("111",2200,1.23);
            Customer c = new Customer("Jamc",a);
            
            c.getAct().deposit(100);
            c.getAct().withdraw(960);
            c.getAct().withdraw(2000);
    }
}

class Account{
    private String id;
    private double balance;
    private double annualInterestRate;
    
    //
    public Account(){
        
    }
    public Account(String id,double balance,double annualInteretRate){
        this.id = id;
        this.balance = balance;
        this.annualInterestRate = annualInterestRate;
    }
    public String getId(){
        return id;
    }
    public double getBalance(){
        return balance;
    }
    public double getAnnualInterestRate(){
        return annualInterestRate;
    }
    
    
    public void setId(String id){
        this.id = id;
    }
    public void setBalance(String balance){
        this.balance = balance;
    }
    public void setAnnualInterestRate(String annualInterestRate){
        this.annualInterestRate = annualInterestRate;
    }
    
    public void deposit(double money){
        //this.balance += money;
        this.setBalance(this.getBalance() + money);
    }
    
    public void withdraw(double money){
        if(money > this.getBalance()){
            System.out.println("余额不足,取钱失败");
            return;
        }
        //this.balance -= money;
        this.setBalance(this.getBalance() - money);
    }
}

class Customer{
    private String name;
    priavte Account act;
    
    public Customer(){
        
    }
    
    public Customer(String name,Account act){
        this.name = name;
        this.act = act;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }
    
    public void setAct(Account act){
        this.act = act;
    }
    
    public Account getAct(){
        return act;
    }
}
public class Homework{
    public static void main(String[] args){
        Student s1 = new Student();
        
    }
}

class Student{
    private String name;
    private int age;
    private String address;
    private String zipoode;
    private String mobile;
    
    public Student(){
        
    }
    
    public Student(String name, int age, String address,String zipoode, String mobile){
        this.name = name;
        this.age = age;
        this.address = address;
        this.zipoode = zipoode;
        this.mobile = mobile;
    }
    
    //get set
    
    public setName(String name){
        this.name = name;
    }
    
    public setAge(String age){
        this.age = age;
    }
    
    public setAddress(String address){
        this.address = address;
    }
    
    public setZipoode(String zipoode){
        this.zipoode = zipoode;
    }
    
    public setMobile(String mobile){
        this.mobile = mobile;
    }
    
    public void getName(){
        return name;
    }
    
    public void getAge(){
        return age;
    }
    
    public void getAddress(){
        return address;
    }
    
    public void getZipoode(){
        return zipoode;
    }
    
    public void getMobile(){
        return mobile;
    }
}

大总结

类体{
    实例变量;
    实例方法;
    
    静态变量;
    静态方法;
    
    构造方法;
    
    静态代码块;
    实例代码块;
    
    方法(){
        int i = 100;
    }
}

public class Review{
    public static void main(String[] args){
        int i  = 100;
        Student s = new Student();
        s.study();
        s.eat();
        
    }
}

class Student{

    static {
        System.out.println("gdnzv");
    }
    private int no;
    private String name;
    static String job = "学习";
    
    {
        System.out.println("fff");
    }
    
    public Student(){
        this(100,"张三");
    }
    
    public Student(int no,String name){
        this.no = no;
        this.name = name;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }
    
    public void setNo(String no){
        this.no = no;
    }
    
    public String getNo(){
        return no;
    }
    
    public void study(){
        System.out.println(this.name);
        System.out.println(name);
        System.out.println(getName());
        System.out.println(this.getName());
        //this.eat();
        eat();
        Student.m1();   //类名可以省略
        m1();
    }
    
    pblic static void m1(){
        System.out.println("1r32r"+job);//自动在job前添加类名。
    }
    
    public void eat(){
        System.out.println();
    }
    
}
public class Review{
    
    int i;
    static int j;
    
    public void m1(){
        
    }
    
    public void m2(){
    
    }
    
    public void x(){
        m1();//都可以。
        m2();
        m3();
        m4();
        T.t1();
        T t = new T();
        t.t2();
    }
    
    public static void m3(){
    
    }
    
    public static void m4(){
    
    }

    //main方法是静态的,JVM调用main方法的时候直接采用的是类名.的方法。没有this。
    //m1()和m2()是实例方法,按照Java语法规则来说,实例方法必须new对象,再通过引用.的方式访问。
    public static void main(String[] args){
        m1();//错误
        m2();//错误
        m3();   //自动识别静态方法,自动Review.m3();
        m4();
        //i不能访问,j可以。
        //调用实例变量或方法先new。
    }
}

class T{

    public static void t1(){
        
    }   
    
    public void t2(){
    
    }
}
  • 只要负责调用的方法a和被调用的方法在同一个类中this. 可以省略 类. 可以省略

你可能感兴趣的:(static&&this)