Java基础 | Java面向对象 | 02

类和对象

Java基础 | Java面向对象 | 02

万物皆对象,现实世界任何存在的客观事物都是对象。

Java基础 | Java面向对象 | 02

如上图所示,只要是现实世界存在的客观事物,都可以是对象。

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

创建类 & 对象实例化

Java基础 | Java面向对象 | 02

和操作系统中一样,我们可以通过不同的文件夹来管理同名文件,在Java中文件夹就是这样包。

包的命名规范:

  • 英文字母小写
  • 域名的倒序

创建宠物猫类

package com.imooc.animal;

/**
 * 宠物猫类
 * 
 * @author rowrycho
 *
 */
public class Cat {
	// 属性:昵称、年龄、体重、品种
	String name;
	int month;
	double weight;
	String species;

// 方法:跑动、吃东西
	public void run() {
		System.out.println("小猫快跑");
	}

// 重载方法
	public void run(String name) {
		System.out.println(name + "快跑");
	}

	public void eat() {
		System.out.println("小猫吃鱼");
	}
}

创建一个猫的测试类

package com.imooc.animal;

public class CatTest {
	public static void main(String[] args) {
		// 实例化对象
		Cat one = new Cat(),two=new Cat(); 
		// 测试
		one.eat();
		one.run();
		
		// 给属性赋值
		one.name = "花花";
		one.month = 2;
		one.weight = 1000;
		one.species = "英国短毛猫";
		
		// 测试成员变量的默认初始值
		System.out.println("昵称:"+one.name);
		System.out.println("年龄:"+one.month);
		System.out.println("体重:"+one.weight);
		System.out.println("品种:"+one.species);
		
		one.run(one.name);
	}
}

运行结果

Java基础 | Java面向对象 | 02

如果没有没成员属性赋初值直接使用的话,不会报错,默认就是0和null。但是如果局部变量没有给初值,就会报错。

Java基础 | Java面向对象 | 02

单一职责/功能原则

为什么要将Cat和CatTest两个类分开?

单一职责原则,一个类最好就一个功能,这样可以大大降低耦合度,大大类的复用性。

这两个类是如何关联的?

Java有自己的搜索机制,main运行的时候,首先会搜索同一个java文件中的类,如果没有找到,再去搜索同一个包中的类。

new关键字

Java基础 | Java面向对象 | 02

声明对象 和 实例化对象 是两步操作。

  • 声明对象:在栈中进行对象声明。

  • 实例化对象:在堆中进行对象的实例化。

Java基础 | Java面向对象 | 02

如果只声明了对象,并没有对对象实例化,那么是不能使用对象的,因为此时对象只在栈中进行了声明,其值为null。

Java基础 | Java面向对象 | 02

栈中主要存储局部变量,堆中存储动态数据。

如果是基本类型,那么变量和值都是存储在栈中的,如果是类,那么栈中只会存储一个堆的地址,然后堆中存储真正的对象数据。

Java基础 | Java面向对象 | 02

new了两个对象,那么这两个对象在堆中是两个独立的空间,相互之间是不影响的。

Cat one = new Cat();
Cat two = one; // 两个变量指向同一内存地址

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

如果对象只需要使用一次,那么就可以不用声明对象,直接new Cat()使用一次。

Java基础 | Java面向对象 | 02

同时声明多个变量

Cat one = new Cat(),two=new Cat(),three = new Cat();

构造方法——无参构造方法

Java基础 | Java面向对象 | 02

构造方法要和new配合使用,不能被对象单独调用。

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

package com.imooc.animal;

/**
 * 宠物猫类
 * 
 * @author rowrycho
 *
 */
public class Cat {
	// 属性:昵称、年龄、体重、品种
	String name;
	int month;
	double weight;
	String species;

	// 构造方法


// 方法:跑动、吃东西
	public void run() {
		System.out.println("小猫快跑");
	}

// 重载方法
	public void run(String name) {
		System.out.println(name + "快跑");
	}

	public void eat() {
		System.out.println("小猫吃鱼");
	}
}

构造方法——有参构造方法

通过带参数的构造方法,完成对象的属性赋值。

package com.imooc.animal;

/**
 * 宠物猫类
 * 
 * @author rowrycho
 *
 */
public class Cat {
	// 属性:昵称、年龄、体重、品种
	String name;
	int month;
	double weight;
	String species;

	// 通过该构造方法进行属性赋值
	public Cat(String name, int month, double weight, String species) {
		this.name = name;
		this.month = month;
		this.weight = weight;
		this.species = species;
	}


}

package com.imooc.animal;

public class CatTest {
	public static void main(String[] args) {
		// 实例化对象
		Cat one = new Cat("花花",2,1000,"英国短毛猫"); // 通过构造函数给对象的属性赋值
		// 测试
		one.eat();
		one.run();
		

		// 测试成员变量的默认初始值
		System.out.println("昵称:"+one.name);
		System.out.println("年龄:"+one.month);
		System.out.println("体重:"+one.weight);
		System.out.println("品种:"+one.species);
	}
}

this表示当前对象。

构造方法调用

注意:构造方法只能在构造方法直接进行调用,构造方法不能被成员方法调用。

package com.imooc.animal;

/**
 * 宠物猫类
 * 
 * @author rowrycho
 *
 */
public class Cat {
	// 属性:昵称、年龄、体重、品种
	String name;
	int month;
	double weight;
	String species;

	// 构造方法
	public Cat() {
		System.out.println("这是无参构造方法");
	}
	
	
	public Cat(String name) {
		this(); // 调用无参构造方法
		System.out.println("这是有参构造方法");
	}

	public Cat(String name, int month, double weight, String species) {
		this("你好");
		this.name = name;
		this.month = month;
		this.weight = weight;
		this.species = species;
	}


}

this关键字

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

Java基础 | Java面向对象 | 02

注意: this()调用构造方法,必须放在方法体内第一行。

小结

面向对象的三大点

封装、继承、多态

什么是对象?

对象是类的示例表现。

什么是面向对象?

人关注对象
人关注事物信息

通过对象来完成事情的交互,而不是通过面向过程的方式。

什么是类?

类是模子,确定对象将拥有的特征(属性)和行为(方法)。

类和对象的关系?

类是更加抽象的概念,对象是类的实例化。
类是对象的类型,对象是特定类型的数据。

什么是属性和方法?

属性:对象有什么
方法:对象能做什么

关于包的知识点

和操作系统中一样,我们可以通过不同的文件夹来管理同名文件,在Java中文件夹就是这样包。

包的命名规范:

*   英文字母小写
*   域名的倒序

局部变量、成员变量未赋初值,打印的结果?

局部变量未赋初值,那么就报错。
成员变量未赋初值,那么就会默认是0,或null。

为什么要将Cat和CatTest两个类分开?

**单一职责原则**,一个类最好就一个功能,这样可以大大降低耦合度,大大类的复用性。

这两个类是如何关联的?

Java有自己的搜索机制,main运行的时候,首先会搜索同一个java文件中的类,如果没有找到,再去搜索同一个包中的类。

声明对象 & 实例化对象

声明对象: Cat one;
实例化对象: one=new Cat();

通常写为 Cat one = new Cat();

栈 & 堆

栈:存储局部变量
堆:存储动态数据

堆存储对象数据
栈中存储变量,如果是对象句柄,那么只存储堆地址;如果是基本类型变量,那么就存储变量名和变量值。

int a=10; // 全部都存储在栈内存
Cat one = new Cat(); // one存储在栈内存,new Cat()存储在堆内存

构造方法

	public Cat() {
		System.out.println("这是无参构造方法");
	}

	public Cat(String name) {
		System.out.println("这是有参构造方法");
	}

构造方法与类同名且没有返回值(构造方法是没有类型的)
只能在new的时候被调用
没有指定构造方法时,系统会自动添加无参的构造方法
当有指定构造方法,无论是有参还是无参,都不会自动添加无参的构造方法
一个类中可以有多个构造方法

构造方法的调用

注意:构造方法只能在构造方法直接进行调用,构造方法不能被成员方法调用。

this(); // 调用无参构造方法
this(”你好"); // 调用有参构造方法

this关键字

this:当前对象的默认引用

this的使用
	调用重载构造方法(必须放在第一行)
	调用成员属性(解决成员属性和局部变量同名冲突)
	调用成员方法