Java构造⽅法及关键字:this、super、final、static
⼀、构造⽅法
1
在创建对象时,需要明确对象的属性值,即当使⽤new关键字创建对象时,同时给对象的属性初始化值。
这就需要⽤到构造⽅法。构造⽅法的格式:
修饰符构造⽅法名(参数列表){
}
构造⽅法的特点:
1、构造⽅法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,⽅法就执⾏结束。
2、构造⽅法名称必须和类名保持⼀致。
3、当不写构造⽅式时,系统默认有个空参构造⽅法,但是当创建有参构造时,系统则不再默认赋予空参构造,如果需要空参构造需要⾃⼰添加
Eclipse快捷添加构造⽅法:⿏标右击》Sourse》Generate Constructor
例:
class Person {
// Person的成员属性age和name
private int age;
private String name;
//空参构造
Person() {
}
// Person的构造⽅法,拥有参数列表
Person(int a, String nm) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
public void speak() {
System.out.println("name=" + name + ",age=" + age);
}
}
2
创建上述Person类对象,并初始化成员变量
class PersonDemo {
public static void main(String[] args) {
// 创建Person对象,并明确对象的年龄和姓名
//初始化成员变量
Person p2 = new Person(23, "张三");
p2.speak();
}
上述代码的图解:
l图解说明:
1、⾸先会将main⽅法压⼊栈中,执⾏main⽅法中的 new Person(23,"张三");
2、当发现new 在堆内存中分配⼀⽚区域,⽤来存放创建的Person对象,这⽚内存区域会有属于⾃⼰的内存地址(0x88)。然后给成员变量进⾏默认初始化(name=null,age=0)。
3、执⾏构造⽅法中的代码(age = a ; name = nm;),将变量a对应的23赋值给age,将变量nm对应的”张三赋值给name,这段代码执⾏结束后,成员变量age和name的值已经改变。执⾏结束之后构造⽅法弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2。
3
1、⼀个类中可以有多个构造⽅法,多个构造⽅法是以重载的形式存在的
2、构造⽅法是可以被private修饰的,作⽤:其他程序⽆法创建该类的对象。
3、构造⽅法在对象创建时就执⾏了,⽽且只执⾏⼀次。
⼀般⽅法是在对象创建后,需要使⽤时才被对象调⽤,并可以被多次调⽤
⼆、关键字:this
1、构造⽅法之间的调⽤,可以通过this关键字来完成。
class Person {
// Person的成员属性
private int age;
private String name;
// ⽆参数的构造⽅法
Person() {
}
// 给姓名初始化的构造⽅法
Person(String nm) {
name = nm;
}
// 给姓名和年龄初始化的构造⽅法
Person(String nm, int a) {
/
/ 由于已经存在给姓名进⾏初始化的构造⽅法 name = nm;因此只需要调⽤即可
// 调⽤其他构造⽅法,需要通过this关键字来调⽤
this(nm);
// 给年龄初始化
age = a;
}
}
2
可以在成员变量名前⾯加上this.来区别成员变量和局部变量
class Person {
private int age;
private String name;
// 给姓名和年龄初始化的构造⽅法
Person(String name, int age) {
// 当需要访问成员变量是,只需要在成员变量前⾯加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
p.speak();
}
三、关键字:super
1
在创建⼦类对象时,⽗类的构造⽅法会先执⾏,因为⼦类中所有构造⽅法的第⼀⾏有默认的隐式super();语句。
调⽤本类中的构造⽅法
this(实参列表);
调⽤⽗类中的空参数构造⽅法
super();
调⽤⽗类中的有参数构造⽅法
super(实参列表);
⼦类构造⽅法执⾏时中,调⽤了⽗类构造⽅法,这说明,⼦类构造⽅法中有⼀句super()。
那么,⼦类中的构造⽅法为什么会有⼀句隐式的super()呢?
原因:⼦类会继承⽗类中的内容,所以⼦类在初始化时,必须先到⽗类中去执⾏⽗类的初始化动作。这样,才可以使⽤⽗类中的内容。当⽗类中没有空参数构造⽅法时,⼦类的构造⽅法必须有显⽰的super语句,指定要访问的⽗类有参数构造⽅法。
public class Test {
public static void main(String[] args) {
new Zi();
}
}
class Fu{
int num ;5
Fu(){
System.out.println("Fu构造⽅法"+num);
num = 4;
}
}
class Zi extends Fu{
Zi(){
//super(); 调⽤⽗类空参数构造⽅法
System.out.println("Zi构造⽅法"+num);
}
}
执⾏结果:
Fu构造⽅法0
Zi构造⽅法4
2、⼦类对象创建过程的细节
类中的构造⽅法默认第⼀⾏都有隐式的super()语句,在访问⽗类中的空参数构造⽅法。所以⽗类的构造⽅法既可以给⾃⼰的对象初始化,也可以给⾃⼰的⼦类对象初始化。
如果默认的隐式super()语句在⽗类中没有对应的构造⽅法,那么必须在构造⽅法中通过this或者super的形式明确要调⽤的构造⽅法。
如果⼦类的构造⽅法第⼀⾏写了this调⽤了本类其他构造⽅法,那么super调⽤⽗类的语句
四、关键字:final
1、概念
继承的出现提⾼了代码的复⽤性,并⽅便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分⽅法功能是固定的,不想让⼦类重写。
要解决上述的这些问题,需要使⽤到⼀个关键字final,final的意思为最终,不可变。final是个修饰符,它可以⽤来修饰类,类的成员,以及局部变量。不能修饰构造⽅法。2、final的特点
1、 final修饰类不可以被继承,但是可以继承其他类。
2、final修饰的⽅法不可以被⼦类重写,但可以被继承。⽗类中没有被final修饰⽅法,⼦类重写后可以加final。
class Fu {
// final修饰的⽅法,不可以被覆盖,但可以继承使⽤
public final void method1(){}
public void method2(){}
}
class Zi extends Fu {
//重写method2⽅法
public final void method2(){}
}
3、 final修饰的变量称为常量,这些变量只能赋值⼀次。⽽且终⾝不变。
final int i = 20;
i = 30; //赋值报错,final修饰的变量只能赋值⼀次
4、引⽤类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //报错,final修饰的变量p,所记录的地址值不能改变
p.name = "⼩明";//可以更改p对象中name属性值
5、修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造⽅法的均需要为其赋值。),可以通过构造⽅法赋值,⼀次赋值终⾝不变
class Demo {
//直接赋值
final int m = 100;
//final修饰的成员变量,需要在创建对象前赋值,否则报错。
final int n;
public Demo(){
//可以在创建对象时所调⽤的构造⽅法中,为变量n赋值
n = 2016;
}
}
五、关键字:static
java重载1
static它是静态修饰符,⼀般⽤来修饰类中的成员(成员变量、⽅法)。
其修饰的类,可以不创建对象,直接调⽤其⽅法
2、static特点
1、被static修饰的成员变量属于类,不属于这个类的某个对象。
也就是说,多个对象在访问或修改static修饰的成员变量时,其中⼀个对象将static成员变量值进⾏了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同⼀个static成员变量
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //结果为200
System.out.println(d2.num); //结果为200
}
}
2、被static修饰的成员可以并且建议通过类名直接访问。
访问静态成员的格式:
类名.静态成员变量名
类名.静态成员⽅法名(参数)
对象名.静态成员变量名 ------不建议使⽤该⽅式,会出现警告
对象名.静态成员⽅法名(参数) ------不建议使⽤该⽅式,会出现警告
class Demo {
//静态成员变量
public static int num = 100;
//静态⽅法
public static void method(){
System.out.println("静态⽅法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
}
}
3、static注意事项
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论