美文网首页
static&&this

static&&this

作者: 雪上霜 | 来源:发表于2020-04-19 16:13 被阅读0次
    • 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

          本文链接:https://www.haomeiwen.com/subject/ycbsbhtx.html