《NEWedge–JAVA》0402 引用、static、this、super、final关键字–面向对象
对象与引用
我们前文已经提到,在JAVA中的数据类型分为基本数据类型和引用数据类型,即就是除基本数据类型之外,皆为引用数据类型,由此看来,java中的对象是通过引用对其操作的。
Student student=new Student();
右边的“new Student()”,是以Student类为模板,调用Student类的构造函数,在堆空间里创建一个Student类对象。
左边的“Student student”创建了一个student类引用变量。所谓student类的引用,就是以后可以用来指向student对象的对象引用。
”=”操作符使对象引用指向刚创建的那个Car对象。
//也可以写成这个样子
Student student;
student=new Student();
基本数据类型 | 引用数据类型 | |
---|---|---|
概念 | 变量(单纯的值) | 对象(引用) |
存储位置 | 在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的 | 只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址 |
传递方式 | 在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的 | 引用数据类型变量,调用方法时作为参数是按引用传递 |
值传递与引用传递
•值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
•引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身 。
static
静态,可用于修饰成员变量、成员方法、代码块等。
具有以下性质:
•随着类的加载而加载
•优先于对象存在
•修饰的成员,被所有对象所共享
•可不创建对象,直接被类调用
注意:
- 静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存中只有一个。
- 只能用于修饰成员变量,不能用于修饰局部变量
- static方法可以使用对象调用,也可以直接用类名调用,建议用类名直接调用
块
代码块在类中声明,类似一个没有名称的方法体(代码块),代码块分实例块和静态块
实例块:每次创建对象时自动调用
接下来我们比较以下块、静态块、构造方法的优先级。
public class Dome {
{ //实例块
System.out.println("hello 1 实例块");
}
static{ //静态块
System.out.println("hello 2 静态块");
}
public Dome(){ //构造方法
System.out.println("hello 3 构造方法");
}
public static void main(String[] args) {
Dome dome=new Dome();
}
}
运行后,我们可得出他们三者的优先级如下图所示: 静态块>实例>构造方法
如果在子类中,那么父类和子类其中的优先级呢?
public class Dome {
{ //实例块
System.out.println("hello 1 父类-实例块");
}
static{ //静态块
System.out.println("hello 2 父类-静态块");
}
public Dome(){ //构造方法
System.out.println("hello 3 父类-构造方法");
}
}
public class Test extends Dome{
{ //实例块
System.out.println("hello 4 子类-实例块");
}
static{ //静态块
System.out.println("hello 5 子类-静态块");
}
public Test(){ //构造方法
System.out.println("hello 6 子类-构造方法");
}
public static void main(String[] args) {
Test test=new Test();
}
}
通过运行,我们可发现其优先级为:父类静态块>子类静态块>父类实例块>父类构造方法>子类实例块>子类构造方法。
注:静态代码块在类第一次使用时才会被加载,并且只会加载一次。
this
this是用来指代当前对象,用于方法中访问对象的其他成员。
1.通过this调用成员变量,解决与局部变量名称冲突的问题。
public class Test {
String name;
public Test(String name) {
this.name = name;
}
}
//this.name就是全局变量name,即就是将局部变量name的值赋给全局变量name。
2.通过this调用成员方法
public class Test {
public void dome1(){
// java程序
}
public void dome2(){
this.dome1();
}
}
3.通过this调用构造方法
public class Test {
public Test() {
System.out.println("无参的构造方法");
}
public Test(String name) {
this();
System.out.println("有参的构造方法");
}
}
注意:
1.只能在构造方法中使用this调用无参的构造方法,不能在成员方法中使用。
2.且在构造方法中,使用this调用构造方法的语句必须是在该方法的第一条执行语句。
3.this关键字必须放在非静态方法里面
super
•super关键字代表父类的引用,在程序中主要的用途
•在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
•用“super.成员变量名”来引用父类成员变量
•用“super.方法名(参数列表)”的方式访问父类的方法。
与this的区别,this通常指代当前对象,super通常指代父类。
final
•final 用于声明属性,方法和类
•属性:定义就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改。
•方法:子类里不可被覆盖(重写)。
•用“super.成员变量名”来引用父类成员变量
•用“super.方法名(参数列表)”的方式访问父类的方法。
踏着层层台阶登攀,然然继续准备《NEWedge–JAVA》系列文章的更新;文中难免有纰漏或者错误,您若发现,烦请及时评论留言,我会在第一时间校正。或者,可以用评论留言的方式谈谈您的收获、想法和建议,方便更多的人学习收益!然然在此谢谢啦!,我们下次见