第二阶段-面向对象(一)

面向对象

软件开发方式

1.面向过程(我该怎么做)
面向过程:强调的是 <我该怎么去做>
面向过程的设计思想,系统软件适应性差,可拓展性差,维护性低
2.面向对象(我让谁帮我做)
面向对象:强调的是 <我该让谁来做>
面向对象最小的程序单元是类,必须先存在类的定义,再有对象,而具备某种功能的实体,称为对象。
//面向过程和面向对象的区别
面向过程和面向对象各有千秋,面向对象更符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
//面向对象有三大特征
封装(Encapsulation)
继承(lnheritance)
多态(Polymorphism)
//在面向对象的世界中,如果你想做什么,首先找对象!!!
3.什么是抽象
//所谓抽象:就是把现实世界的事物,提取其公共的特征和行为,也即提取其像的部分,提取到计算机中的过程。

假设我要做一个宠物管理系统
对宠物进行抽象-->提取宠物公共的特征和行为--->计算机怎么描述出这个抽象--->通过类创建对象

成员变量和局部变量

1.变量的分类
//成员变量(字段):直接定义在类的内部,在方法的外部,作为类的成员

//局部变量:方法内定义的变量、形参、和代码块(一对花括号{}中)的变量
//{ }中的变量总结:
1.{ }称为代码块,可以形成作用域
2、作用域能不能嵌套,内层作用域可以访问外层作用域的变量,外层不能访问内层作用域的变量。
2.变量的初始值
//成员变量:有初始值,初始值与数组一样
//局部变量:没有初始值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHiewnLa-1611654533633)(C:\Users\古\AppData\Roaming\Typora\typora-user-images\image-20210118145023466.png)]

3.变量的作用域
//成员变量:在所定义的类中都有效
//局部变量:从开始定义的位置开始,只能在自己所在的花括号内有效
4.变量的生命周期
变量的生命周期,表示变量在内存中能存在多久。
//成员变量:存储在堆内存中,随着对象的销毁而销毁
//局部变量:存储在堆内存中,随着所定义的方法的调用结束而销毁
    局部变量存储在方法中,每次调用方法都会在栈空间开辟一块内存空间——栈帧,方法调用
结束,栈帧就被销毁了,内存中的存储的变量数据也销毁了

类和对象的关系

( class ):类是一组具有相同特征和行为的对象的抽象描述(集合),是一个群体概念
对象( object ):对象是类这个群体中的一个唯一的、独立的个体,对象是个体概念,这个个体在程序中称为实体或实例。
    //任何事物存在就有一定的功能,在面向对象中,任何事物都可以看成对象,也就是万物皆对象的概念。
//注意,在开发中,必须先有类,再使用new关键字根据类来创建出对象。

类的定义

/**类是拥有相同特性(状态)和行为(功能)的多个对象的抽象描述
 *使用成员变量来表示状态
 *使用成员方法表示行为
 */
定义语法格式:
    public class 类名{
	   //可编写0到N个成员变量
		[修饰符] 数据类型 变量名1;
		[修饰符] 数据类型 变量名2;
 	   //可编写0到N个成员方法
		[修饰符] 返回值类型 方法名称(参数){
			//方法体
	}
}
//注意:
1.成员变量和方法都 不 能使用static修饰,修饰符是可选用的
2.在面向对象设计中,描述对象的类和测试类分开来编写
3.在描述对象的类中,不需要定义main方法,专门在测试类中提供main方法。

对象操作

1.对象基本操作
//1.创建对象
类名 对象变量名 = new 类名();
//1. 直接打印对象的时候,打印的是类似于数组一样的hashCode值
System.out.println(对象变量名);//格式如:类名@3294e4f4
//2. 匿名对象:创建对象之后没有赋给某一个变量,只能使用一次(先知道)
new 类名();
对象操作字段(成员变量)
//1. 给字段设置数据
对象变量名.字段名 =;
//2. 获取字段数据
数据类型 变量 = 对象变量名.字段名;

//对象调用方法:
对象变量名.方法(参数);
public class CatDemo {
	public static void main(String[] args) {
		// 1:创建Cat对象,对象的变量名为c
		Cat c = new Cat();
		// 2:获取字段的值,先看看字段的初始值
		String n = c.name;
		int a = c.age;
		System.out.println("名字=" + n);
		System.out.println("年龄=" + a);
		// 3:给字段设置值
		c.name = "汤姆";
		c.age = 5;
		// 4:设置字段值后,再获取字段的值
		n = c.name;
		a = c.age;
		System.out.println("名字=" + n);
		System.out.println("年龄=" + a);
		// 5:调用对象的方法
		c.say();// 猫说话的功能
}
2.对象实例化过程-内存分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tmNVXtaC-1611654533636)(C:\Users\古\AppData\Roaming\Typora\typora-user-images\image-20210118153051343.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8orlJvs-1611654533638)(C:\Users\古\AppData\Roaming\Typora\typora-user-images\image-20210118153113608.png)]

通过对象调用方法 c.say(); System.out.println(this.name+", "+ this.age);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oH3oF2Fe-1611654533642)(C:\Users\古\AppData\Roaming\Typora\typora-user-images\image-20210118153136557.png)]

构造器

1.构造器的语法和特点
[修饰符] 类名(参数){
    //方法体
}
注意:
1.构造器名称和类名相同 
2.不能定义返回类型 
3.构造器中不能使用return语句
2.默认的构造器
    如果文件中没有定义构造器,那么编译器在编译源文件的时候,会创建一个缺省的构造器也就是默认构造器
//默认构造器的特点:无参数、无方法体。
3.通过构造器设置初始值
public class Cat {
	String name;
	int age;
	//通过构造器同时完成对象创建和初始化操作
    //带参数构造器
    public Cat(String n, int a) {
		name = n;
		age = a;
	}
    //无参数构造器
	public Cat(){
    }
    
    void say() {
		System.out.println("我是" + name + ",今年" + age + "岁");
	}
}
//可以同时存在带参构造器和无参构造器,他们的关系是重载

封装思想

封装是面向对象三大特征之一,其含义有两个:
    1.把对象的字段和方法存放在一个独立的模块中(类);
    2.信息隐藏,尽可能隐藏对象的数据和功能的实现细节
封装的好处:
    1.保证数据的安全性,防止调用者随意修改数据
    2.提高组件的重用性,把公用功能放到一个类中,谁需要该功能,直接调用即可。

访问修饰符

封装其实就是要让有些类看不到另外一些类中的定义的字段和方法。
Java提供了不同的访问权限修饰符来限定类中的成员让谁可以访问到
修饰符类内部同一个包子类任何地方
private
protected
public
private:表示当前类私有的,类访问权限,只能在本类中操作,离开本类之后就不能直接访问
不写(缺省): 表示当前包私有,包访问权限,定以和调用只能在用一个包中,才能访问
protected:表示子类访问权限,同包中的可以访问,即使不同包但是有继承关系也可以访问
public: 表示公共的,可以在当前项目中任何地方访问
    
//    把所有的字段使用private修饰,所有方法使用public修饰

JavaBean规范

JavaBean是一种某些符合条件的特殊类,但是必须遵循一定的规范:
1.类必须使用public修饰符
2.必须保证有公共无参数构造器,即使手动提供了带参数的构造器,也得手动提供无参数构造器
3.字段使用private修饰(私有化),每个字段提供一对getter和setter方法
//注意:每一个字段都得使用private修饰,并提供一对getter/setter方法。
public class Student {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String n) {
		name = n;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int a) {
		if(a < 0) {
			System.out.println("非法的年龄");
			return;
		}
		age = a;
	}
}

测试类:

public class StudentDemo {
	public static void main(String[] args) {
		Student s = new Student();
		// 调用setter方法设置字段数据
		s.setName("小明");
		s.setAge(12);
		// 调用getter方法获取字段数据
		String n = s.getName();
		int a = s.getAge();
		System.out.println(n + "," + a);
	}
}

测试类:

public class StudentDemo {
	public static void main(String[] args) {
		Student s = new Student();
		// 调用setter方法设置字段数据
		s.setName("小明");
		s.setAge(12);
		// 调用getter方法获取字段数据
		String n = s.getName();
		int a = s.getAge();
		System.out.println(n + "," + a);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值