Java—类与对象
对象与类
Java中将现实对象中的信息称为属性(也叫全局变量),将现实对象中的功能称为方法。
定义一个类的步骤:1、定义类名;2、定义类的属性;3、定义类的方法。
a、命名规范:类名是标识符中的一种,首先符合标识符;首字母大写多个单词构成时每个单词首字母都需要大写(驼峰式命名法)
例:
public class Student {
//定义属性
String id; //学号
String name; //学生姓名
String grade; //学生年级
//定义读书方法
public void readBook() {
System.out.println(name + “正在读书……");
}
//定义写作业方法
public void doHomework() {
System.out.println(this.name + “正在写作业……");
}
}
b、对象创建:new 类名();
通过new关键字创建对象。创建对象又称实例化对象。
Student student = new Student();
使用”.”运算符访问对象的属性和方法。
student . 属性 = 值;
student . 方法名();
例:
public class TestStudent {
public static void main(String[] args) {
Student student = new Student();//创建李四学生类对象
//相当于创建一个属于Student类型的对象,然后将该对象保存的内存地址赋值给student变量。
student.id = "wl2014001";
student.name = "李四";
student.grade = "三年级";
student.readBook();//调用学生读书方法
student.doHomework();//调用学生写作业的方法
}
}
代码块
代码块分为静态和非静态两类:
1.静态代码块只在类加载时执行一次;
public class Test {
static{
System.out.println("静态代码块");
}
public static void main(String[] args) {
}
//运行时会对这个Test类进行加载,即会执行static中的语句
}
2.非静态代码块每次创建对象时都会执行;
public class Test {
{
System.out.println("非静态代码块");
}
public static void main(String[] args) {
new Test();
new Test();
}
//加载此类是不执行,只有创建此类的一个对象时才执行
}
如何定义方法
格式:
访问控制符 [修饰符] 返回值类型 方法名( [参数] ) {
}
1.访问控制符: public、protected、默认的、private
2.修饰符: static、final、synchronized
static修饰的方法可以直接使用类名调用也可以使用类创建的对象调用;
非static修饰的方法只能使用类创建的对象调用。
有static修饰时:
在创建对象时调用一次,还可以直接用类名调用。
无static修饰时:
只能在创建对象时调用。
3.返回值类型:
如果方法没有返回值,需要用void表示。
返回值类型必须是返回数据所属的数据类型或者其父类。
例:
其中Object为String类型的父类。
方法如果有返回值,则必须借助return关键字将数据返回;
4.方法名命名: 遵循标识符命名规则;首字母必须小写,如果由多个单词组成,从第二个单词开始首字母必须大写;方法名一般由一个动词或者动名词构成。
5.参数: 方法参数前面的数据类型用于限制调用方法时所传具体数据的数据类型;
动态参数: 1、动态参数实质为数组;
2、动态参数必须位于参数列表的最后;
3、一个方法只能有一个动态参数;
例:
public class Test {
public static void print(int... numbers) {
for (int number : numbers) {
System.out.println(number);
}
}
//动态参数
public static void main(String[] args) {
print(1, 2, 3, 4, 5);
}
}
方法的重载
同一个类中有多个方法名相同但参数列表不同的方法,这种现象称为方法重载(overload)。其中参数列表不同包括以下情形:
1、参数的个数不同
2、参数的对应类型不同
注意:
1、参数列表不同并不包含参数名不同,也就是说如果方法名相同,方法中参数个数和类型相同,只是参数名不同,这样也不能称之为方法重载。
2、方法中其它构成部分不参与比较:访问控制符、修饰符、返回值类型。
一个类中有多个同名方法(构造方法或普通方法),在调用这些方法时,到底调用哪个方法取决于调用方法时传入的参数的数据类型和个数。
例:
public class Teacher {
public static void print(int age, String name) {
System.out.println(age + "," + name);
}
public static void print(String name, int age) {
System.out.println(name + "," + age);
}
public static void main(String[] args) {
print(33, “王小红”);// 依次传入int类型和String类型数据,所以调用第一个方法
print("王小红", 33);//依次传入String类型和int类型数据,所以调用第二个方法
}
}
全局变量和局部变量
全局变量: 直接在类中声明的变量叫全局变量(又称成员变量);
局部变量: 方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量,局部变量的作用域范围从定义的位置开始到其所在语句块结束。
注:
1.如果局部变量的名字与全局变量的名字相同,则在局部变量的作用范围内全局变量被隐藏,即这个全局变量在同名局部变量所在方法内暂时失效。
2.如果想要在局部变量的作用域范围内访问该全局变量,则必须使用关键字this来引用全局变量。
3.全局变量有默认值:int分配初始值0、boolean分配初始值false,而自定义类型则分配初始值null;
局部变量无默认值,不赋值会出错。
4.全局变量可以用static和final修饰,局部变量只能用final修饰。
关键字static
成员变量
static修饰的成员变量称为类属性(又称静态变量):类成员变量的值在所有对象之间共享; JVM加载类时初始化值;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
没有static修饰的成员变量称为实例属性(又称非静态变量):变量值只属于单个对象;JVM执行创建对象代码时初始化值;只能使用对象来调用。
方法
static修饰的方法称为类方法(又称静态方法):此种方法被所有该类的对象共享; JVM加载类时为其分配入口地址;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
没有static修饰的方法称为实例方法(又称非静态方法):此种方法对所有该类的对象都是独立的; JVM执行创建对象代码时为其分配入口地址并且只分配一次;只能使用对象来调用;
代码块
static修饰的代码块称为静态代码块:JVM加载类时该类型代码块执行并且只执行一次;
没有static修饰的代码块称为非静态代码块:JVM执行创建对象代码时执行并且每创建一个对象执行一次;
注意:
1.静态方法不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
2.静态代码块不能直接调用非静态方法;可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态代码块可以直接调用静态方法;
3.静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用;非静态方法或者静态代码块只能直接使用静态变量;
构造方法
**构造方法:**用于对某个对象赋值。
package Student;
public class Student {
String id;
String name;
String address;
String mobile;
public Student() {
}
public Student(String id, String name, String address, String mobile) {
this.id = id;
this.name = name;
this.address = address;
this.mobile = mobile;
}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public Student(String id, String name, String address) {
this(id,name);
this.address = address;
}//5.在一个类中可用this关键字来调用本类中的构造方法
public static void main(String[] args) {
Student student1 = new Student("111","Tom","河南","12345678910");
Student student2 = new Student("222","Jack","北京","10987654321");
//1.原因:简化对象成员变量赋值过程
//2.格式:a.名字为类名 b.无返回值部分 c.不能用static和final修饰
//3.特点:当显式定义一个构造方法时,原默认的无参构造方法会被取消,即new Student;语句会出错
//只有在其中再加上public Student() {}时才不会出错
//4.一个类中可定义多个构造方法(方法的重载)
new Student("120","Jim");
}
}
this关键字
this: 指向调用它的那个对象。
package Student;
public class Student {
String name = "Tom";
public void print() {
System.out.println(this);
}
//谁调用this,this就指向谁
public static void main(String[] args) {
Student student = new Student();
System.out.println(student);//打印student的地址
student.print();
//this被student调用,则this为student的地址
new Student().print();
//再次创建了对象,地址不同
}
}
结果:
Student.Student@52e922
Student.Student@52e922
Student.Student@25154f
对象初始化过程
用new创建并初始化对象步骤:
1.给对象的实例变量(非“常量”)分配内存空间,默认初始化全局变量;
2.全局变量声明的初始化;
3.初始化块初始化(又称为构造代码块或非静态代码块);
4.构造方法初始化
例:
package Student;
public class Student {
//先默认初始化全局变量,再给全局变量赋值
String name="-1";
String sex="-1";
String age="-1";
String grade="-1";
//对象的初始化块初始化
{
System.out.println(name+age+sex+grade);
System.out.println("使用初始化块初始化");
this.name="John";
this.age="22";
this.sex="男";
this.grade="大学";
System.out.println(name+age+sex+grade);
}
//无参构造方法
public Student() {
System.out.println("使用无参构造函数初始化");
}
//构造方法,用户初始化对象的成员变量
public Student(String name, String sex, String age, String grade) {
this.name = name;
this.sex = sex;
this.age = age;
this.grade = grade;
System.out.println("使用有参构造函数初始化");
}
public static void main(String[] args) {
Student student = new Student("Jim","20","女","大学");
System.out.println(student.name+student.age+student.sex+student.grade);
}
}
结果:
-1-1-1-1
使用初始化块初始化
John22男大学
使用有参构造函数初始化
Jim女20大学