Java笔记:static、this关键字
1.类是java里面的重要内容,可以把类当成一种自定义数据类型,使用类来定义变量,这种类型的变量统称为引用变量。所以类是引用数据类型。
2.面向对象中两个重要概念:类和对象。类是抽象的,对象是具体存在的。
3.构造器是一个类创建对象的根本途径,如果一个类没有构造器,那么这个类通常无法创建实例创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。
4.static关键字
1)static可以用于修饰方法,Field等。static修饰的成员表明它属于这个类本身,而不属于该类的单个实例,通常把static修饰的Field和方法也称为类Field、类方法。
不使用static修饰的普通方法、Field则属于该类的单个实例,不属于该类。通常把不使用static修饰的Field和方法也称为实例Field、实例方法。
static修饰的成员不能访问没有static修饰的成员。(静态成员不能直接访问非静态成员)
2)static类型的变量是所有对象共享的内存空间,也就是说无论最终有多少个对象,也都只有一个static类型的属性。
3)static修饰的方法和Field,既可以通过类来调用,也可以通过实例来调用,没有使用static修饰的普通方法和Field,只可以通过实例来调用。
eg:static修饰的方法或Field的调用:Person.talk();或p.talk();
非static修饰的方法或Field的调用:p.talk();
4)如果在类中声明了一个static类型的属性,则此属性既可以在非static类型的方法中使用,也可以在static类型的方法中使用。但若要用static类型的方法调用非static类型的属性,就会出现错误。
5)static的真正作用是用于就是用于区分Field、方法、内部类、初始化块这四种成员到底属于类本身还是属于实例。
在类中定义的成员,有static修饰的成员属于类本身,没有static修饰的成员属于该类的实例。
5.Person p = new Person();
栈内存里的引用变量并未真正存储对象的Field数据,对象的Field数据实际存放在堆内存里;而引用变量只是指向该堆内存里的对象。
6.this关键字
1)Java提供了一个this关键字,this关键字总是指向调用该方法的对象。
根据this出现位置的不同,有两种情形:
(1)在构造器中引用该构造器正在初始化的对象;
(2)在方法中引用调用该方法的对象。
2)this关键字最大的作用就是让类中一个方法,访问该类里的另一方法或Field。
3)this可以代表任何对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但是它的类型是确定的,它所代表的对象只能是当前类;只有当这个方法被调用时,它所代表的对象才被确定下来:谁调用这个方法,this就代表谁。
4)static修饰的方法可以直接使用类来调用方法。如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰的方法中不能使用this引用。
eg:
package cn.it.lsl; class Dog{ public void jump(){ System.out.println("jump方法....."); } public void run(){ //this.jump(); ////java允许对象的一个成员直接调用另一个成员,可以省略this前缀。 jump(); System.out.println("run方法...."); } public static void say(){ System.out.println("say方法...."); } } public class DogTest { //如果在类中声明了一个static类型的属性,则此属性既可以在非static类型的方法中使用,也可以在static类型的方法中使用。 private static String name = "zhangsan"; //但若要用static类型的方法调用非static类型的属性,就会出现错误。 //private String name = "zhangsan"; public void info(){ System.out.println(name); System.out.println("info方法...."); } public static void main(String args[]){ Dog dog = new Dog(); dog.run(); //static修饰的方法可以直接使用类调用。 Dog.say(); //info(); //静态成员不能直接访问非静态成员。 //info()是对象相关的方法,而不是类相关的方法,因此必须使用对象来调用该方法。 new DogTest().info(); //如果确实需要在静态方法中访问一个普通方法,则只能重现创建一个对象。 System.out.println(name); } }