1.
this的使用:this是属于一个对象的,而不是属于一个类的。当你创建了一个对象的时候,Java虚拟机就为每个对象都给了个this,this就指向了该对象了
this不能在外部使用,只能在类定义的部分中使用
public class Testthis{
int a,b,c;
Testthis(int a,int b){
this.a=a;
this.b=b;
}
Testthis(int a,int b,int c){
this(a,b);//注意这里,这里调用的是上面那个构造方法,但若直接写成Testthis(a,b)是错误的???谁会写;并且该句必须放在第一句
this.c=c;
}
void sing(){}
void eat(){}
public static void main(String args[]){
Testthis hi= new Testthis(2,3);
hi.eat();
}
}
其次,this不能用在static方法中,因为static方法是放在方法区当中的,this指向对象,因此它是在堆当中的。当你在static方法中用this,会发现里面都没有对象,因此是不可以的。
关于为什么this(a,b)必须放在第一句,原因在于:在构造函数中,如果你不指定构造器之间的调用关系,那么编译器会给你加上super();目的是在初始化当前对象时,先保证了父类对象先初始化。所以,你指定了构造函数间的调用,那么this()必须在第一行,以保证在执行任何动作前,对象已经完成了初始化,不然你还没初始化就在那里this.a+this.b啥的能没有问题吗?this()和super()为构造方法,作用是在JVM堆中构建出一个对象。因此避免多次创建对象,同一个方法内只能调用一次this()或super()。同时为了避免操作对象时对象还未构建成功,需要this()和super()的调用在第一行实现【以此来创建对象】,防止异常。
2.
类变量(静态变量):使用关键字"static"声明;访问权限 static 数据类型 变量名;
使用static的变量:在某一个类中声明了static变量(又叫类变量或静态变量),则该类的所创建的所有对象,全都共享这个变量。其他类是不共享这个变量的,也就是不能访问,即使要访问,也只能通过类变量所在的类来访问。
3.
类方法(静态方法):使用关键字"static"声明;访问权限 static 返回类型 方法名();
注意!类方法(或说静态方法)中只能访问类变量(或说静态变量)!因为静态方法在方法区中,而普通的成员变量、方法都在堆当中,因此不能够去调用。但在普通成员方法中是可以访问到静态方法的,因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象的内存中才有这个方法的代码段。
类似过来,静态方法中也就不能用this、super等了,因为this存在于堆当中,而静态方法存在于方法区中
4.
类变量和类方法是一种公共的属性,它并不是在每个对象中的个体属性。类变量或类方法可以通过类名.类变量/类方法的方式来访问,但是假若访问权限有控制,例如某个类变量
为private的,则不能去访问。
静态块:
当程序加载类的时候就会自动调用它
5.
Java的特征:(抽象)封装 继承 多态
抽象:即使用类。类是对具体事物的一个抽象。
封装:封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(即通过成员方法访问),才能对数据进行访问。
其实Java中,尽量地将成员变量设为Private的
6.
public:对外公开
protected:对子类和同一个包中的类公开
default:没有修饰符,对同一个包中的类公开
private:只有类本身可以访问,不对外公开
public>protected>default>private
访问权限
|
同一个类 |
同一个包
|
子类(不同包中)
|
不同的包
|
public
|
?? |
??
|
??
|
??
|
protected
|
??
|
??
|
??
|
|
default
|
??
|
??
|
同一个包下子类可以访问
|
|
private
|
??
|
|
|
|
7.包
package 包名 //一定是第一句
包名:域名倒着写即可,再加上模块名,便于内部管理,e.g:
jd.com,那么包名就是com.jd,后面还可以加模块名
包相当于一个个文件夹
注意:com.chen和com.chen.car,这两个包没有包含关系,是两个完全独立的包,放在com.chen下的类属于chen里的,放在com.chen.car里的类,属于car里的,它们只是逻辑上看起来后者是前者的一部分
JDK中提供了很多默认的包,可以去Java API查找
java.lang.*:自动引入,不需要手动引入
java.util.*:工具包
java.net.*:网络开发包
java.awt.*:窗口工具包
"import包.*"是很方便,但是它有会降低编译(不是运行)速度,而且这样不知道是哪个类