signed

QiShunwang

“诚信为本、客户至上”

第七章:面向对象

2021/3/20 23:54:40   来源:

JavaSE学习历程

第一章:Java初识
第二章:Java语言基础
第三章:选择结构与分支结构
第四章:循环结构
第五章:方法/函数
第六章:数组

第七章:面向对象

1 对象

1.1 程序

程序是为了模拟现实世界,解决现实问题而使用计算机语言编写的指令集合.

1.2 对象

面向对象思想(OOP)

一切客观存在的事物都是对象.
任何对象,一定具有自己的特征和行为

特征:称为属性,一般为名词,代表对象有什么.
行为:称为方法,一般为动词,代表对象能做什么…

2 类

2.1 类的定义

  • 属性:通过变量表示,又称实例变量。
  • 语法:数据类型 属性名;
  • 位置:类的内部,方法的外部。
  • 方法:通过方法表示,又称实例方法。
  • 语法:
    public 返回值类型 方法名(形参){
    //方法的主体
    }
  • 注意:不再书写static,后续详解。
  • 在类的属性中直接赋值,实例化的对象就有这个值可以直接使用
  • 类属性不赋值,也有默认值存在,默认值与数组的默认值一致.

2.2 类与对象的关系

类:模板(一个)----创建----->对象:实例(多个)

  • 类:定义了对象应具有的特征和行为,类是对象的模板。
  • 对象:拥有多个特征和行为的实体,对象是类的实例。
public class Dog {

	// 定义属性(名称、性别、岁数、颜色、品种)
	//在类的属性中直接赋值,实例化的对象就有这个值可以直接使用
	//类属性不赋值,也有默认值存在,默认值与数据的默认值一致.
	//String name = "张三";
	String name;
	String sex;
	int age;
	String color;
	String Varieties;

	/**
	 * 
	 * 叫
	 */
	public void bark() {
		System.out.println("狗吠");
	}

	/**
	 * 玩
	 */
	public void play() {
		System.out.println("游戏");
	}

	/**
	 * 睡
	 */
	public void sleep() {
		System.out.println("打呼噜");
	}
}

public class TestDog {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建对象,实例化狗类
		Dog myDog = new Dog();
		
		//狗类属性赋值
		myDog.name = "啦啦";
		myDog.age = 2;
		myDog.color = "灰色";
		myDog.sex = "雄性";
		myDog.Varieties = "中华田园犬";
		
		System.out.println("我有一条"+ myDog.Varieties+"叫"
				+myDog.name+",它是"+myDog.sex+",毛色为"+myDog.color+",今年"+myDog.age+"岁了!");
		myDog.bark();
		myDog.play();
		myDog.sleep();
	}

}

3 类得组成

3.1 实例变量

局部变量,必须赋值再使用,否则编译错误.
实例变量:未赋值就被调用,不会产生编译错误,实例变量有默认值.

实例变量的默认值

- 整数:0
- 小数:0.0
- 字符:''--->\u0000--->空字符
- 布尔:false
- 其他:null

3.2 实例变量与局部变量的区别

局部变量实例变量
定义位置方法或方法内的结构当中类的内部,方法的外部
默认值无默认值字面值(与数组相同)
使用范围从定义行到包含其结构体结束本类有效
命名冲突不允许与局部变量名重名不允许与实例变量重名,可与局部变量名重名,局部变量优先

3.3 实例方法

  • 对象的实例方法包含两部分:方法的声明和方法的实现.
  • 方法的声明:
  • 代表对象能做什么
  • 组成:修饰符 返回值类型 方法名(形参列表)
  • 方法的实现:
  • 代表对象怎么做:即如何实现对应的功能
  • 组成:{逻辑代码}

4.4 案例

定义学生类: - 属性:姓名(name)、年龄(age)、性别(sex)、分数(score) -
方法:打招呼(sayHi) //打印学生所有信息 - 创建多个学生对象,为其各个属性赋值,并调用方法

public class TestStudent {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 创建对象
		Student str = new Student();
		// 给对象赋值
		str.name = "张三";
		str.age = 18;
		str.sex = "男";
		str.score = 59.6;
		// 调用方法
		str.sayHi(str);
	}
}

class Student {
	//定义属性
	String name;
	int age;
	String sex;
	double score;
	
	//定义方法
	public void sayHi(Student str) {
		System.out.println("我是"+str.name+",今年"+str.age+"岁了,"+str.sex+"性"+",成绩:"+str.score);
	}
	
}

4 方法重载

4.1 方法重载概念

现实生活中存在一些情况,对象的同一种行为可能存在多种实现过程,例如:吃饭和吃药的过程就存在差异
到底采用哪种实现过程,需要取决于调用者给定的参数.

4.2 方法的重载(Overload)

重载(Overload):一个类中定义多个相同名称的方法。

要求:

  • 方法名称相同。
  • 参数列表不同(类型、个数、顺序)。
  • 与访问修饰符、返回值类型无关。

调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法。
好处:灵活、方便、屏蔽使用差异。

只是参数名称的不同,不能构成方法的重载

public class TestCal {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//实例化对象
		Cal myCal = new Cal();
		int a=1,b=2,c=3,d=4;
		
		//调用方法
		System.out.println(a+"+"+b+"="+myCal.add(a, b));
		System.out.println(a+"+"+b+"+"+c+"="+myCal.add(a, b,c));
		System.out.println(a+"+"+b+"+"+c+"+"+d+"="+myCal.add(a, b,c,d));
	}

}

class Cal {
	
	//定义二参数方法,使用方法的重载
	public int add(int a,int b) {
		return a+b;
	}
	
	//定义三参数方法
	public int add(int a,int b,int c) {
		return a+b+c;
	}
	
	//定义四参数方法
	public int add(int a,int b,int c,int d) {
		return a+b+c+d;
	}
}

5 构造方法

5.1 构造方法

构造方法:类中的特殊方法,主要用于创建对象。
特点:

  • 名称与类名完全相同。
  • 没有返回值类型。
  • 创建对象时,触发构造方法的调用,不可通过句点手动调用。
  • 如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法。

5.2 对象的创建

对象的创建过程:

  • 内存中开辟对象空间
  • 为各个属性赋予初始值
  • 执行构造方法中的代码
  • [将对象的地址赋值给变量]

5.3 对象的内存分配

创建对象时,内存中存储的是对象变量名(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法。

5.4 构造方法的重载

构造方法的重载,遵循重载规则
创建对象时,根据传入参数,匹配对应的构造方法。

5.5 默认构造方法

  • 在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法.
  • 如已手动添加有参构造方法,则无参构造方法不再默认提供,可根据需求自行添加.

5.6 构造方法为属性赋值

  • 创建对象的同时,将值传入构造方法
  • 由构造方法为各个属性赋值

5.7 案例

构造方法重载,并进行实例化

package com.xx;

/**
 * @Title: Demo08.java
 * @Description: TODO:构造方法重载,并进行实例化
 * @since JDK1.8
 */
public class Demo08 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//实例化对象
		Stu str = new Stu();
		//创建对象的同时,将值传入构造方法,由构造方法为各个属性赋值
		Stu str2 = new Stu("张三");
		Stu str3 = new Stu("张三",18);
		Stu str4 = new Stu("张三",18,"男");
		Stu str5 = new Stu("张三",18,"男",56.3);

		
	}

}

class Stu {

	// 定义属性
	String name;
	int age;
	String sex;
	double score;

	//构造方法的重载
	// 无参数构造方法
	public Stu() {
		System.out.println("我是无参数构造方法");
	}
	
	//一参数构造方法
	public Stu(String n) {
		name = n;
		age = 18;
		sex = "男";
		score = 56.3;
		System.out.println("我是一参数构造方法");
		System.out.println("姓名:"+name);
	}
	
	//二参数构造方法
	public Stu(String n,int a) {
		name = n;
		age = a;
		sex = "男";
		score = 56.3;
		System.out.println("我是二参数构造方法");
		System.out.println("姓名:"+name+"年龄:"+a);
	}
	
	//三参数构造方法
	public Stu(String n,int a,String s) {
		name = n;
		age = a;
		sex = s;
		score = 56.3;
		System.out.println("我是三参数构造方法");
		System.out.println("姓名:"+name+"年龄:"+a+"性别:"+s);
	}
	
	//四参数构造方法
	public Stu(String n,int a,String s,double sc) {
		name = n;
		age = a;
		sex = s;
		score = sc;
		System.out.println("我是四参数构造方法");
		System.out.println("姓名:"+name+"年龄:"+a+"性别:"+s+"成绩:"+sc);
	}
}

6 this关键字

6.1 this关键字

  • 类是模板,可服务于此类的所有对象;
  • this是类中的默认引用,代表当前实例;
  • 当类服务于某个对象时,this则指向这个对象

6.2 this关键字的两种用法

6.2.1 第一种用法

this第一种用法:调用实例属性、实例方法。如:this.name、this.sayHi()。

  • 当实例变量和局部变量重名时,优先访问局部变量。
  • 此时,如需访问实例变量,需要增加this.前缀。
  • 不存在重名时,则可省略this。

6.2.2 第二种用法

this第二种用法:调用本类中的其他构造方法,只能使用在构造方法之中,不能调用普通方法。如:this()、this(实参)。

  • this():调用无参构造
  • this(实参):调用有参构造
  • 注:必须在构造方法的首行

this()和super()为调用构造方法,作用是在JVM堆中构建出一个对象。因此避免多次创建对象,同一个方法内只能调用一次this()或super()。同时为了避免操作对象时对象还未构建成功,需要this()和super()的调用在第一行实现【以此来创建对象】,防止异常。

6.3 案例

使用this调用本类属性和方法

package com.xx;

/**
 * @Title: Demo09.java
 * @Description: TODO:使用this调用本类属性和方法
 * @since JDK1.8
 */
public class Demo09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//实例化对象
		Stud str = new Stud("张三");
		Stud str2 = new Stud("张三",18);
		Stud str3 = new Stud();
	}

}

class Stud {

	// 定义属性
	String name;
	int age;
	
	//无参构造方法
	public Stud() {
		String name = "李四";
		this.name = "张三";
		System.out.println("未使用this调用-->姓名:" + name);
		System.out.println("使用this调用-->姓名:" + this.name);
	}

	// 一参数构造方法
	public Stud(String name) {
		//this调用本类属性
		this.name = name;
		System.out.println("我是一参数构造方法");
		System.out.println("姓名:" + name);
	}

	// 二参数构造方法
	public Stud(String name, int age) {
		//this调用本类一参数构造方法且必须在构造方法的首行
		this(name);
		this.age = age;
		System.out.println("我是二参数构造方法");
		System.out.println("姓名:" + name + "年龄:" + age);
	}
}

7 总结

类是代码的容器;
类就是对象的模板(抽象)—>对象:类的实例,拥有多个特征(属性)和行为(方法);

方法重载规则:方法名相同,参数类型个数顺序不同,与访问修饰符和返回值无关;
方法重载调用:根据实参的类型个数顺序来决定调用哪个重载的方法!

构造方法:类中特殊方法,主要用于创建对象
特点:
1.方法名与类名完全相同
2.没有返回值类型
3.创建对象时,触发构造方法的调用,不可通过 .方法名 进行手动调用.
4.如果类中没有显示定义构造方法,则编译器默认提供无参构造方法;
5.若定义了构造方法,编译器不再提供无参构造方法,强烈建议手动写上无参构造方法.