构造方法总结:
构造方法: 特殊方法,它的作用是在对象创建的时候自动执行一些初始化工作。
特征: a.方法名与类名一致
b.没有返回值类型,甚至连void也没有
c.不能被final static synchronized abstract等修饰
d.不可以像普通方法一样随意调用,只能在对象创建时调用一次
e.所有的类都必须有构造器(若类中没有构造器,编译器会自动添加一个无参构造器,若类中有构造器,编译器不会自动添加无参构造器)
构造器的使用:构造器可以重载
构造器间可以利用this()调用,实现连锁调用,但至少应该有一个没有使用this()(不能无限递归)
this()调用必须在第一行(有效行),保证对其他构造器的调用必须先执行。
包含构造器,对象在创建时,内存中的执行过程分析:
源程序:
内存执行过程分析:
匿名对象:创建一个对象,直接调用对象的方法,不将对象的内存地址保存在引用类型变量
匿名对象可以作为实参给方法传值。
若在方法中以对象为参数时,在方法中可以利用引用修改对象的信息。
面向对象中的两个关键字:package,import
package:告诉编译器当前源文件中的所有类最终生成class文件后,class文件保存的包目录结构。
package必须写在程序的第一行。
命名:字母全部小写
四部分:机构类型名称.机构名称.项目名称.模块名称
注:类中一旦使用了package语句,这个类的编译不一样,
javac -d . 源文件.java (在当前目录中生成package语句中指示的包目录结构)
类名不一样,在调用这个类的时候一定要写类的全限定名称(全称包名+类名)
import: 导类,建议一个一个类的导入,这样更清晰。
import作用告诉编译器,当前的源文件中要使用的其他包的类在什么包目录下面。
java.lang包中所有类都已经自动导入。
对于构造器,对象作为参数传递,package,import关键字有如下小例子供参考。
package com.atguigu.javase.javabean;
/**
Student类,包含id,name,gender,major属性封装,
并提供两个构造器,一个是无参的另一个是4个参数的
并添加say方法
再添加一个参数的构造器,参数是id,
在构造器中使用this(...)实现构造器的连锁调用
*/
public class Student {
//对属性进行封装
private int id;
private String name;
private String gender;
private String major;
//无参构造器,若是自己没有定义构造器,系统会自动添加一个默认的无参构造器
public Student() {
this(1); //利用this()实现构造器的连锁调用(调用,栈结构)
//this()必须在有效行的第一行,保证对其他构造器的调用必须先执行
//this()不能无限递归
System.out.println("Student()....");
}
//参数为id的有参构造器
public Student(int id) {
this(id,"未知","未知","未知");
System.out.println("Student(int)....");
}
//参数为int id, String name, String gender, String major的有参构造器
public Student(int id, String name, String gender, String major) {
this.id = id;
this.name = name;
this.gender = gender;
this.major = major;
System.out.println("Student(int,String,String,String)");
}
//为外界提供一个公共调用属性的方法
//id的set/get方法
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
//neme的set/get方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//gender的set/get方法
public void setGender(String gender) {
this.gender = gender;
}
public String getGender() {
return gender;
}
//major的set/get方法
public void setMajor(String major) {
this.major = major;
}
public String getMajor() {
return major;
}
//将形参设置为引用类型的,如Phone ph
//在该类中使用其他类的对象
public void call(Phone ph) {
System.out.println(this.say() + ",在使用手机" + ph.say() + "打电话");
}
//say方法
public String say() {
return "学号:" + id + ",名字:" + name + ",性别:" + gender + ",专业:" + major;
}
}
package com.atguigu.javase.javabean;
/*
写一个phone类,属性os,screen
在Student类中添加一个方法,call(Phone phone)
在测试类中调用call方法
*/
public class Phone {
private String os;
private double screen;
public Phone() {
}
public Phone(String os, double screen) {
this.os = os;
this.screen = screen;
}
public void setOs(String os) {
this.os = os;
}
public String getOs() {
return os;
}
public void setScreen(double screen) {
this.screen = screen;
}
public double getScreen() {
return screen;
}
public String say() {
return "[操作系统:" + os + ",屏幕大小:" + screen + "]";
}
}
package com.atguigu.javase.test; //机构类型名.机构名称.项目名称.模块名称
import com.atguigu.javase.javabean.Student; //导入Student类
import com.atguigu.javase.javabean.Phone; //导入Phone类
/**
在测试类中分别使用两个构造器创建两个对象,
打印输出对象的详细信息
注:1.类中一旦使用了package语句,这个类的编译不一样。
javac -d . 源文件.java 在当前目录中生成package语句中
指示的包目录结构
2.类中一旦使用了package语句这个类的类名也会不一样。
在其他类中使用该类,必须使用该类的全限定名称(全称包名+类名)
*/
public class StudentTest {
public static void main(String[] args) {
//使用无参构造器创建对象
//com.atguigu.javase.javabean.Student s1 = new com.atguigu.javase.javabean.Student();
Student s1 = new Student();
System.out.println(s1.say());
//使用4参构造器创建对象
//com.atguigu.javase.javabean.Student s2 = new com.atguigu.javase.javabean.Student(2,"沈yl","男","计算机");
Student s2 = new Student(2,"沈yl","男","计算机");
System.out.println(s2.say());
//s2.call(new com.atguigu.javase.javabean.Phone("andriod",5.0));
s2.call(new Phone("andriod",5.0));
}
}