9.28-面向对象

核心思想

  • 面向对象是一种常见的思想,符合人们的思考习惯

  • 面向对象的出现将复杂的事情简单化

  • 面向对象的出现将我们的身份由执行者变为了指挥者

    • 面向对象需要关注两个重点

    • 有没有这个对象

  • 这个对象中具不具备这样的功能

面向对象开发(仅了解)

就是不断的创建对象,使用对象,指挥对象做事情,有对象就找这个对象做事情,没有对象就自己创建一个对象,使其拥有这样的功能;其他人也可以使用这个对象。

面向对象设计(仅了解)

其实就是管理和维护对象之间的关系

面向对象的特征(重点)

封装、继承、多态、抽象

类与对象之间的关系

  • 用Java语言对现实生活的事物进行描述,需要通过类的形式来体现。

  • 对于事物的描述通常只关注两个方面:一个是属性,一个是行为(功能/方法);只要明确该类事物的属性和行为定义在类中即可。

类(class)

某一类事物的描述(属性/行为)

对象

该类事物中一个实实在在的个体(实体/实例)

在Java中,通过new关键字来创建

成员变量和局部变量有什么区别

  1. 成员变量定义在类中,整个类都可以访问

  2. 变量定义在方法、语句、局部代码块中,只在所属区域是有效的

  3. 成员变量存储在堆内存的对象中;局部变量存储在栈内存的方法中

  4. 成员变量随着对像的创建而存在,随着对象的消失而消失;局部变量随着所属区域的执行而存在,随着所属区域的结束尔释放。

  5. 成员变量都有默认初始化值;局部变量没有默认初始化值

例子

package day01;

public class Car {
	/**
	 * 描述小汽车
	 * 分析:
	 * 1.属性
	 *   轮胎数
	 *   颜色
	 * 2.行为
	 *   运行
	 */
	int num /*= 4*/;//轮胎数,显示初始化(但是默认初始化依旧存在)
	String color;//颜色
	//运行的功能
	void run() {
//		int num = 8;
		System.out.println(num+","+color);
	}
}
package day01;

public class CarDemo01 {//测试类
	public static void main(String[] args) {
		//在Java中创建一个Car的实例。通过new关键字
//		Car c = new Car();//c也可以叫做引用变量
//		c.num = 4;
//		c.color = "red";
//		c.run();
		/*
		 * 要使用对象中的内容(属性/行为),可以通过
		 * 对象.成员的方式来完成调用
		 * 不管是属性还是行为都是这类事物的组成部分
		 * 都称之为成员,属性又叫做成员变量,行为又
		 * 叫做成员方法,定义类就是在定义该类的成员
		 */
//		Car c1 = new Car();
//		Car c2 = new Car();
//		c1.num = 5;
//		c2.color = "blue";
//		c1.run();
		Car c1 = new Car();
		Car c2 = c1;//一个对象可以被多个变量所引用
		c1.num = 8;
		c2.color = "green";
		c1.run();
	}
}
package day01;

public class CarDemo02 {
	public static void main(String[] args) {
//		Car c = new Car();
//		c.run();
//		new Car();//匿名对象
//		new Car().num = 7;
//		new Car().color = "yellow";
//		new Car().run();
		//需求:批量生产4个轮子红色的汽车
		Car c1 = new Car();
//		c1.num = 4;
//		c1.color = "red";
		Car c2 = new Car();
//		c2.num = 4;
//		c2.color = "red";
		show(c1);
		show(c2);
	}
	//汽车改装厂
	public static void show(Car c) {//引用类型也叫作类类型
		c.num = 4;
		c.color = "red";
	}
}

内存图

Car内存图一
Car内存图2
Car内存图3

private关键字

权限修饰符,权限为私有;用于修饰成员;私有的内容只在本类中有效

例子

package day9_28;

public class PersonDemo {//测试类
	public static void main(String[] args) {
		Person p = new Person();
//		p.age =23;
		p.setAge(23);
		p.speak();
	}
}
/*
 * 一个.java中可以书写多个类,但最多只能有一个public修饰的类;
 *并且public修饰的类的类名要与.java的文件名一致
 */
class Person{//描述人类
	private int age;//年龄属性
	/*对属性的草错无非就是两种
	 * 一种是获取属性的值
	 * 一种是给属性设置值
	 */
	
	public void setAge(int a) {
		if(a>0&&a<200) {
			age = a;
		}else {
			System.out.println("不是人的年龄");
		}
		
	}
	//说话的行为
	void speak() {
		System.out.println("age="+age);
	}
	
}

封装思想

将属性私有化,对外提供公有的访问方式

注意,将属性私有化仅仅是封装思想的一种体现

构造方法(构造器constructor)

定义构造器的特点

  1. 构造器的名称要与类名一致(包括大小写)

  2. 不需要定义返回值类型

  3. 没有具体的返回值

  4. 构造器定义在类中

作用

给对象进行初始化(给对象中的属性进行赋值)

例子

package day9_28;

public class ConstructorDemo {
	public static void main(String[] args) {
		People p = new People();
		p.speak();
		People p1= new People("旺财");
		p1.speak();
		People p2=new People("哪吒", 3);
		p2.speak();
		/*
		 * 构造方法就是创建对象时调用的方法
		 * 作用:可以给对象进行初始化,使对象一旦创建就具备了一些内容
		 * 创建对象都必须经过构造器进行初始化
		 * 一个类中如果没有写任何的构造器,那么这个类中就会有一个默认的无参构造器
		 * 一旦手动添加了构造器,那么默认的无参构造器就不存在
		 */
	}
}
class People{//人类
	private String name;//姓名属性
	private int age;//年龄属性
	//定义无参构造器
	public People() {
		name="baby";
		age=1;
		System.out.println("People Run!!");
		}
	//有参构造器(指定姓名)
	public People(String n) {
		name=n;
	}
	//有参构造器(指定姓名与年龄)
	public People(String n,int a) {
		name=n;
		age=a;
	}
	public void setName(String n) {
		name = n;
	}
	
	public void speak() {//说话
		
		System.out.println(name+""+age);
	}
}

注意

  1. 默认构造器的特点

  2. 一个类中多个构造器是以"重载"的形式来体现的

    • 重载:同一个类中方法名相同,但是参数列表不同

this关键字

用法一

当一个类中,成员变量和局部变量重名时,可以使用关键字this去区分成员变量

package day9_28;

public class ThisDemo {
	public static void main(String[] args) {
		
	}
	class People{//人类
		private String name;//姓名属性
		private int age;//年龄属性
		//定义无参构造器
		public People() {
			this.name="baby";
			this.age=1;
			System.out.println("People Run!!");
			}
		//有参构造器(指定姓名)
		public People(String name) {
			this.name=name;
		}
		//有参构造器(指定姓名与年龄)
		public People(String name,int age) {
			this.name=name;
			this.age=age;
		}
		public void setName(String name) {
			this.name = name;
		}
		public void speak() {//说话
			System.out.println(this.name+","+this.age);
		}
	}
}

用法二

this还可以在构造器中调用本类的其他构造器

作用

代表当前对象,也就是所在方法所属对象的引用。

简单来说,哪个对象调用了this所在的方法,this就代表哪个对象

例子-例子一接续

	//定义方法,比较两个人的年龄是否相等
	public boolean compare(Person p) {//this
//		if(this.age==p.age) {
//			return true;
//		}else {
//			return false;
//		}
		return this.age==p.age;
	}

最后更新于