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]+", ");
            }
        }
    }
}

 

posted on 2017-06-01 22:20  晨曦年华  阅读(3312)  评论(0编辑  收藏  举报