this
this指的是当前对象:
Person p = new Person(); this指得就是new Person()或p。
使用this关键字可以完成以下的操作:
· 调用类中的属性。
· 调用类中的方法或构造方法。
· 表示当前对象。
通俗的说:只要在类外外面能通过上面对象名p调用的,在类里面都能通过this调用。
class Person{
private String name;
private int age;
Person(){
this("小明",18);
}
Person(String name,int age){
this.name=name;
this.age=age;
}
}
代码第6行用this调用了构造方法Person(String name,int age)。
代码9,10行用this调用了属性。
值得注意的是:
在一个构造方法中调用另一个构造方法时,调用的代码必须编写在构造方法第一行。原因:构造方法的本质是对对象进行一些初始化,在初始化完成之前不能够进行其它操作(例如打印)。
static
static表示“静态”的意思,可以用来修饰成员变量和成员方法。
tatic的主要作用在于创建独立于具体对象的域变量或者方法。简单理解就是:
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。并且不会因为对象的多次创建 而在内存中建立多份数据。
-
静态成员在类加载时加载并初始化。所以第一次通过类调用就需要对其初始化。另一方面static修饰的方法也可以直接通过类调用。
-
无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )。
-
在访问时:静态不能访问非静态 , 非静态可以访问静态 !
class Person1{
static void say(){
System.out.println("疑是地上霜");
say2(); //这一行bug.
}
void say2(){
System.out.println("窗前明月光");
say();
}
}
静态成员的加载永远比创建对象要快。
第9行能通过是因为当say2()被对象调用了(方法只有被对象调用才能使用),静态方法say()已经提前加载了。
而第4行不能通过是因为如果直接通过类调用say()使用时,say2()还未被加载。
对象内存分析
static修饰的变量,随着类第一次被使用加载到方法区中。可以被所有对象共用。
import
就是调用有包的类;也就是导包操作;
import 包名.类名;
main
JVM找程序入口的时候,就找通过public static 修饰的 main方法。
程序之所以能允许起来,就是因为JVM调用了这个main方法。
四个权限修饰符
修饰符 | 类 | 包 | 子类 | 其它包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
√ ×:表示在该情况下,该修饰符修饰的成员能否被访问。
final
使得内存的变量变成一个常量。
final int a = 10; a以后一直为10;
对于局部变量,只能赋值一次(可以先声明后赋值)
对于成员属性,必须声明时赋值。
final能修饰什么
修饰类:final修饰的类,不能被继承;
修饰方法:final修饰的方法,不能被子类重写;
常量命名规范
可以由多个单词组成,单词之间"_"隔开,所有字母大写。