zoukankan      html  css  js  c++  java
  • java学习(四)static静态变量 和this

    java中的this

    /*
        this:是当前类的对象引用。简单的记,它就代表当前类的一个对象。
        
            注意:谁调用这个方法,在该方法内部的this就代表谁。
            
        this的场景:
            解决局部变量隐藏成员变量
    */
    //定义学生类
    class Student {
        //姓名
        private String name;
        //年龄
        private int age;
        
        //姓名获取值
        public String getName() {
            return name;
        }
        
        //姓名设置值
        public void setName(String name) { //name = "林青霞";
            //name = name; //变量的使用规则:就近原则
            //这里是类名,目前还没有说过类似的用法,所以这个是有问题的
            //这里的调用只能通过对象名
            //这个对象如果存在,它应该代表的是Student的一个对象。
            //那么,谁能够代表当前类的对象呢? java就提供了一个关键字 this
            //Student.name = name;
            this.name = name;
        }
        
        //年龄获取值
        public int getAge() {
            return age;
        }
        
        //年龄赋值
        public void setAge(int age) {
            this.age = age;
        }
    }

    java中的static变量

    /*
        static的特点:(它可以修饰成员变量,还可以修饰成员方法)
            A:随着类的加载而加载
                回想main方法。
            B:优先于对象存在
            C:被类的所有对象共享
                举例:咱们班级的学生应该共用同一个班级编号。
                其实这个特点也是在告诉我们什么时候使用静态?
                    如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
                举例:
                    饮水机(用静态修饰)
                    水杯(不能用静态修饰)
            D:可以通过类名调用
                其实它本身也可以通过对象名调用。
                推荐使用类名调用。
                
                静态修饰的内容一般我们称其为:与类相关的,类成员
    */
    class Student {
        //非静态变量
        int num = 10;
        
        //静态变量
        static int num2 = 20;
    }
    
    class StudentDemo {
        public static void main(String[] args) {
            Student s = new Student();
            System.out.println(s.num);
            
            System.out.println(Student.num2);
            System.out.println(s.num2);
        }
    }
    /*
        static关键字注意事项
            A:在静态方法中是没有this关键字的
                如何理解呢?
                    静态是随着类的加载而加载,this是随着对象的创建而存在。
                    静态比对象先存在。
            B:静态方法只能访问静态的成员变量和静态的成员方法
                    静态方法:
                        成员变量:只能访问静态变量
                        成员方法:只能访问静态成员方法
                    非静态方法:
                        成员变量:可以是静态的,也可以是非静态的
                        成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
                简单记:
                    静态只能访问静态。
    */
    class Teacher {
        public int num = 10;
        public static int num2 = 20;
        
        public void show() {
            System.out.println(num); //隐含的告诉你访问的是成员变量
            System.out.println(this.num); //明确的告诉你访问的是成员变量
            System.out.println(num2);
            
            //function();
            //function2();
        }
        
        public static void method() {
            //无法从静态上下文中引用非静态 变量 num
            //System.out.println(num);
            System.out.println(num2);
            
            //无法从静态上下文中引用非静态 方法 function()
            //function();
            function2();
        }
        
        public void function() {
        
        }
        
        public static void function2() {
        
        }
    }
    
    class TeacherDemo {
        public static void main(String[] args) {
            //创建对象
            Teacher t = new Teacher();
            t.show();
            System.out.println("------------");
            t.method();
        }
    }

    java中的main方法

    /*
        main方法的格式讲解:
            public static void main(String[] args) {...}
            
            public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。
            static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。
            void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。你返回内容给jvm没有意义。
            main:是一个常见的方法入口。我见过的语言都是以main作为入口。
            String[] args:这是一个字符串数组。值去哪里了?
                这个东西到底有什么用啊?怎么给值啊?
                    这个东西早期是为了接收键盘录入的数据的。
                    格式是:
                        java MainDemo hello world java
    */
    class MainDemo {
        public static void main(String[] args) {
            //System.out.println(args); //[Ljava.lang.String;@175078b
            //System.out.println(args.length); //0
            //System.out.println(args[0]); //ArrayIndexOutOfBoundsException
            
            //接收数据后
            System.out.println(args); 
            System.out.println(args.length); 
            //System.out.println(args[0]); 
            for(int x=0; x<args.length; x++) {
                System.out.println(args[x]);
            }
        }
    }

     同类中静态方法调用非静态方法

    class ArrayDemo {
        public static void main(String[] args) {
            //定义数组
            int[] arr = {28,55,37,46,19};
        
            //静态方法
            //printArray(arr);
            
            //非静态方法
            //ArrayDemo ad = new ArrayDemo();
            //ad.printArray(arr);
            
            //测试类的作用:创建其他类的对象,调用其他类的功能。
            //而我们现在的操作是跟数组相关的,所以,你应该把这些操作定义到数组操作类中
            //定义一个数组的操作类
            //有了数组操作类之后的调用
            ArrayDemo at = new ArrayDemo();
            at.printArray(arr);
            
        }
        
        /*
        public static void printArray(int[] arr) {
            for(int x=0; x<arr.length; x++) {
                if(x == arr.length-1) {
                    System.out.println(arr[x]);
                }else {
                    System.out.print(arr[x]+", ");
                }
            }
        }
        */
        
        //假设该方法不是静态的
        public void printArray(int[] arr) {
            for(int x=0; x<arr.length; x++) {
                if(x == arr.length-1) {
                    System.out.println(arr[x]);
                }else {
                    System.out.print(arr[x]+", ");
                }
            }
        }
    }

    java中在同一个文件夹下,类定义在两个文件中和定义在一个文件中其实一样的。

    例如在同一个文件夹下有两个文件 ArrayDemo.java 和ArrayTool.java

    实例:

    /*
        在同一个文件夹下,类定义在两个文件中和定义在一个文件中其实一样的。
    */
    class ArrayDemo {
        public static void main(String[] args) {
            //定义数组
            int[] arr = {28,55,37,46,19};
            
            
            //方法改进为静态后,就可以直接通过类名调用
            ArrayTool.printArray(arr);
        }
        
    }
    class ArrayTool {
        
        //把构造方法私有,外界就不能在创建对象了
        private ArrayTool(){}
    
        public static void printArray(int[] arr) {
            for(int x=0; x<arr.length; x++) {
                if(x == arr.length-1) {
                    System.out.println(arr[x]);
                }else {
                    System.out.print(arr[x]+", ");
                }
            }
        }
    }
  • 相关阅读:
    依赖倒置原则
    接口声明
    java泛型
    RandomAccessFile
    InputStreamReader/OutputStreamWriter乱码问题解决
    InputStreamReader和OutputStreamWriter
    Android开发UI之Notification
    Android开发UI之Toast的使用
    Android开发之PagerAdapter
    Android开发UI之ViewPager及PagerAdapter
  • 原文地址:https://www.cnblogs.com/chenchenphp/p/6931052.html
Copyright © 2011-2022 走看看