1、类的简述
类:类是一个模板,它描述一类对象的行为和状态。例如:狗这一类
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
下图中汽车为类(class) ,而具体的每辆车为该汽车类的对象(object) ,对象包含了汽车的颜色、品牌、名称等。
2、Java 中的类与对象
一个源文件中只能有一个public类。一个源文件可以有多个非public类。
源文件的名称应该和public类的类名保持一致
2.1 对象的创建与使用
在Java程序中可以使用new关键字来创建对象,具体格式如下:
类名 对象名称 = new 类型()
例如,创建一个Person对象,具体示例如下:Person p1 = new Person()
- new Person():用于创建Person类的一个实例对象
- Person p 则是声明了一个Person类型的变量p
- 中间的等号用于将Person对象在内存中的地址赋值给变量p,这样变量p便持有了对象的引用
- 变量p和对象之间的引用关系如下图所示
在实例化后,可以通过打点调用对象所有的成员,格式如:实例化对象.对象成员
// 定义一个人类
public class class_demo1{
// 入口主函数
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(); // 可以创建多个实例化对象
p1.age = 18;
p1.sex = 'm';
p1.speak(); // 调用p1实例化对象上的speak方法
System.out.println(p1.age); // 18
System.out.println(p2.age); // 0
}
}
// 定义一个person人类
class Person{
int age; // 声明一个年龄的属性 --> 成员变量
char sex; // 声明一个性别的属性
void speak(){ // 定义普通方法 无返回值 --> 成员方法
if(sex == 'm'){
System.out.println("大家好,我是男生,今年" + age + "岁!");
}else{
System.out.println("大家好,我是女生,今年" + age + "岁!");
}
}
}
2.2 类的封装
类的封装是指在定义一个类时,进行下列操作:
- (1)将类中的属性私有化,即使用private修饰属性
- (2)在类中提供公用的可以获取属性值的getXxx方法
- (3)在类中提供公用的可以设置属性值的setXxx方法
2.3 变量
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
一个类可以拥有多个方法,在上面的例子中:eat()、run() 都是 Dog 类的方法。
3、构造方法
3.1 简述
1、每个类都至少有一个构造方法,如果在一个类中没有显式定义构造方法,java会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。
2、如果一个类中定义了构造方法,系统就不再提供默认的构造方法了,构造方法可支持传参
3、构造方法的执行时机:构造方法在实例化的时候自动执行
3.2 构造方法的定义
在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:
-
方法名和类名相同(一个类可以有多个构造方法)
-
方法名的前面没有返回值类型的声明
-
方法中不能使用return语句返回一个值
下面是一个构造方法示例:
public class Puppy{
public Puppy(){ // 显示写出构造函数 -- 不传参
}
public Puppy(String name){ // 显示写出构造函数 -- 传参
// 这个构造器仅有一个参数:name
}
}
在Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种(default、private、public、protected)不同的访问权限。
3.3 构造方法的重载
- 和普通方法一样,构造方法也可以重载
- 在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。
- 在创建对象时,可以通过调用不同的构造方法为不同的属性赋值
一句话:重载就是可以写很多个同名函数,但是参数不能相同
4、this
4.1、通过this关键字可以明确地去访问一个类的成员变量,解决与局部变量名称冲突的问题,具体示例如下:
public class myThis{
int age; // 成员变量
// 构造方法 自动执行 构造方法中可以使用this 和es6中的class一样
public myThis(int age){ // 参数被定义为age,它是一个局部变量
this.age = age; // this.age 是访问成员变量
}
public static void main(String[] args) {
// 实例化
myThis mt = new myThis(100);
System.out.println(mt.age); // 100
}
}
4.2、通过this关键字调用成员方法
public class myThis{
// speak函数
public void speak(){
System.out.println("我会说");
}
// openMouth函数
public void sleep(){
System.out.println("我能睡");
this.speak();
}
public static void main(String[] args) {
// 实例化
myThis mt = new myThis();
mt.sleep();
}
}
// --> 我能睡 我能说
当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。
class Demo {
String str = "200,****这是成员变量";
void fun(String str) {
System.out.println(str); // 100,---这是局部变量
System.out.println(this.str); // 200,****这是成员变量
this.str = str;
System.out.println(this.str); // 100,---这是局部变量
}
}
public class demo1 {
public static void main(String[] args) {
Demo demo = new Demo();
demo.fun("100,---这是局部变量");
}
}
4.3、构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其它方法一样去调用构造方法,但可以在一个构造方法中使用“this([参数1,参数2…])”的形式来调用其它的构造方法。
4.4 其他注意事项
- 只能在构造方法中使用this调用其它的构造方法
- 在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次,下面的写法是非法的。
- 不能在一个类的两个构造方法中使用this互相调用
public class myThis{
public myThis(int age){ // 参数为int的构造方法
this("涵涵涵"); // 调用myThis(String xxx) 构造方法
}
public myThis(String name){
System.out.println(name);
}
public static void main(String[] args) {
// 实例化
myThis mt = new myThis(100);
}
}
// --> 涵涵涵