1.面向对象
1.1 区分面向对象与面向过程
举个例子:
在传统的洗衣服过程中,需要经历防水,放衣服,放洗衣粉,搓洗,换水......多个步骤,每个过程都是不可或缺的,关注的是过程.
而现在的洗衣服过程,就需要我们把衣服,洗衣粉放入洗衣机,启动洗衣机即可,并不需要关注洗衣机是如何运行的(即不需要关注洗衣过程).整个过程主要是:人,洗衣粉,衣服,洗衣机四个对象之间交互完成的.
2.类的定义和使用
2.1 类的定义格式
①需要用到class关键字
②类名采用大驼峰定义
③成员前写法统一为public
④public修饰的类必须要与文件名相同
⑤main方法所在的类一般使用public修饰
public class PetDog {public String name;public String color;public int age;public void barks(){System.out.println(name+ ":汪汪汪");}public void wag(){System.out.println(name+ ":摇尾巴");}
}
其中,属性称为类的成员变量,功能称为类的成员方法.
3.类的实例化
3.1 概念
- 之前我们使用int,double来定义类型,而定义了一个类,就相当于定义了一种新的类型,同int等类似,而这些类可以定义实例(对象).
- 用类类型创建对象的过程,成为类的实例化.Java中采用new关键字,配合类名来实例化对象.
public class PetDog {public String name;public String color;public int age;public void barks(){System.out.println(name+ ":汪汪汪");}public void wag(){System.out.println(name+ ":摇尾巴");}public static void main(String[] args) {PetDog petDog = new PetDog();petDog.name = "xxx";petDog.color = "黄色";petDog.age = 10;petDog.barks();petDog.wag();}
}
注意:同一个类可以创建多个实例.
4.this引用
4.1 引入
先看此代码:
public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year+"/"+month+"/"+day);}public static void main(String[] args) {Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();d1.setDay(2020,4,7);d2.setDay(2021,6,8);d3.setDay(2022,1,2);d1.printDate();d2.printDate();d3.printDate();}
}
结果为:
思考:
①如果形参名和成名变量名相同呢?
此时并不会给成员变量赋值,而是形参赋给了形参.
②三个对象都在调用setDate和printDate函数,但是两个函数中并没有任何有关对象的说明,那么这两个函数如何知道设置和打印的是哪个对象的数据呢?
4.2 this引用的使用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过改引用去访问.
注意:
①this只能在成员方法中使用
②在成员方法中,this只能引用当前对象,不能再引用其它对象
5.对象的构造及初始化
5.1 初始化对象
我们都知道,在方法内部定义个局部变量式,必须要初始化,否则编译失败:
如果是对象:
那么我们思考:
①每次对象创建好后调用方法设置具体日期,很麻烦,那么对象该如何初始化
②局部变量必须初始化才能使用,为什么字段声明之后没有给值就可以使用?
5.2 构造方法
①构造方法的作用是对对象中的成员进行初始化,并不负责为对象开辟空间.
②名字必须与类名相同,没有返回值类型,void也不行
③一般情况下用public修饰
④在创建对象时,由编译器自动调用,在整个对象的生命周期内只调用一次
⑤构造方法可以重载(名字相同,参数列表不同)
⑥当然,如果用户没有显示定义,编译器默认生成无参构造方法,一旦用户定义,编译器则不再生成
⑦在构造方法中,可以通过this调用其它构造方法简化代码,在无参构造方法中通过this调用带有三个参数的构造方法
⑧不能形成环
5.3 默认初始化
思考:为什么局部变量在使用时必须初始化,而成员变量不用呢?
这是因为对象空间被申请好之后,对象中包含的成员以及设置好了初始值.
5.4 就地初始化
在声明成员变量时,就直接给出初始值
这种方法没什么作用,之后还要进行赋值......
6. static成员
6.1 再谈学生类
- 如果三个同学是同一个班的,那么他们上课肯定是在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?不行!!!
- 之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。
6.2 static修饰成员变量
static修饰的成员变量,称为静态成员(类成员)变量.
【静态成员变量特性】
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
public class Student{public String name;public String gender;public int age;public double score;public static String classRoom = "Bit306";// ...public static void main(String[] args) {// 静态成员变量可以直接通过类名访问System.out.println(Student.classRoom);Student s1 = new Student("Li leilei", "男", 18, 3.8);Student s2 = new Student("Han MeiMei", "女", 19, 4.0);Student s3 = new Student("Jim", "男", 18, 2.6);// 也可以通过对象访问:但是classRoom是三个对象共享的System.out.println(s1.classRoom);System.out.println(s2.classRoom);System.out.println(s3.classRoom);}
}
6.3 static修饰成员方法
一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的
【静态方法特性】
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
补充:
①引用不可以指向引用
引用只能指向对象,下述代码的意思是:student2这个引用指向了student1这个引用所指向的对象
②一个引用不能指向多个对象——海王??
③Person p = null表示不指向任何对象
student不指向任何对象,room不属于对象,是类的,所以不存在空指针异常
④ 静态方法中不能调用任何非静态方法,因为非静态方法依赖对象
public class Test2 {public static void main(String[] args) {Student.funcStatic();}
}class Student{public String name;public int age;//普通成员变量//类方法 不依赖对象public static void funcStatic(){System.out.println("funcStatic()......");}
}
在静态方法中调用时候无法传递this引用
6.4 static成员变量初始化
1.就地初始化
2.静态代码块初始化
......