第二阶段-面向对象
面向对象-day01
9.面向对象概述
9.1. 软件开发方式(了解)
9.1.1.面向过程(了解)
面向过程和面向对象各有千秋,面向对象更符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性,它拥有三大特征:
-
封装(Encapsulation)
-
继承(Inheritance)
-
多态(Polymorphism)
9.1.3.什么是抽象
先来普及一个面向对象中非常重要的一个概念——抽象。
所谓抽象,从特定的角度出发,从已经存在的多个事物中抽取我们所关注的特性、行为,从而产生一个新的事物的思维过程,是一种从复杂到简洁的思维方式。
9.2.1. 变量的分类
根据变量定义位置的不同,分成两大类:
-
成员变量:直接定义在类中,方法外面。又称之为字段(Field),不要称之为属性(错误),后讲
-
局部变量:除了成员变量,其他都是局部变量,具体存在于三个地方
- 方法内
- 方法的形
- 代码块中(一对花括号)
9.2.2.变量的初始值(要记住)
变量的初始化表示在内存中开辟存储空间,只有初始化之后,才能使用。
-
成员变量:默认是有初始值的,不同类型的初始值,如下图
-
局部变量:没有初始值,所以必须手动先初始化才能使用
9.2.3.变量的作用域
变量根据定义的位置不同,也决定了各自的作用域是不同的,关键看变量所在的那对花括号。
-
成员变量:在所定义的类中都有效
-
局部变量:从开始定义的位置开始,只能在自己所在的花括号内有效
9.2.4.变量的生命周期
变量的生命周期,表示变量在内存在能存活多久。
-
成员变量(属于对象):存储在堆内存中,随着对象的销毁而销毁
-
局部变量(属于方法):存储在栈内存中,随着所定义方法的调用结束而销毁
- 局部变量存储在方法中,每次调用方法都会在栈空间开辟一块内存空间——栈帧,方法调用结束,栈帧就被销毁了,内存中的存储的变量数据也销毁了
9.3.类和对象的关系(了解)
面向对象思想中有两个非常重要的概念,类和对象,其中:
-
类(class),是对某一类事务的抽象描述(状态和行为),如下图的抽象女人图。
-
对象(object),表示现实生活中该类事物的个体,也称之为实例,如下图的每一个具体的女人。
-
类可以看作是对象的数据类型,就好比无论你是谁,只要是女人,那么类型就是女人。
9.4. 类的定义
类是拥有相同特性(状态)和行为(功能)的多个对象的抽象。而一般的,描述类或者说定义类,就从状态和行为上分析,那么怎么来表示状态和行为呢?
-
使用成员变量来表示状态
-
使用成员方法来表示行为
定义语法格式:
public class 类名{
//可编写0到N个成员变量
[修饰符] 数据类型 变量名1;
[修饰符] 数据类型 变量名2;
//可编写0到N个成员方法
[修饰符] 返回值类型 方法名称(参数){
//方法体
}
}
注意:
-
成员变量和方法都 不 能使用static修饰,修饰符是可选用的,都先不使用任何修饰符
-
在面向对象设计中,描述对象的类和测试类分开来编写
-
在描述对象的类中,不需要定义main方法,专门在测试类中提供main方法。
9.5. 对象操作
9.5.1. 对象基本操作
-
创建对象
类名 对象变量名 = new 类名();
- 直接打印对象的时候,打印的是类似于数组一样的hashCode值(先不管,后面讲)
System.out.println(对象变量名);//格式如:类名@3294e4f4
- 匿名对象:创建对象之后没有赋给某一个变量,只能使用一次(先知道)
new 类名();
-
对象操作字段(成员变量)
- 给字段设置数据
对象变量名.字段名 = 值;
- 获取字段数据
数据类型 变量 = 对象变量名.字段名;
-
对象调用方法
对象变量名.方法(参数);
9.6.构造器(重点掌握)//如果手动添加了其他构造器,那么默认的就没了,需要手动添加 无参构造器
创建猫对象的时候,代码如下:
Cat c1 = new Cat();
其实这段代码,是在通过调用Cat类的构造器,来创建对象。
构造器,也称之为构造方法(Constructor),作用是用来创建对象和给对象做初始化操作。
构造器的语法和特点:
[public] 类名(参数){
//方法体
}
Cat类的构造器:
public class Cat {
public Cat() {
}
//省略其他代码
}
-
构造器名称和类名相同
-
不能定义返回类型
-
构造器中不能使用return语句
10.封装思想
10.1.访问修饰符(必须记住)
-
private:表示当前类私有的,类访问权限,只能在本类中操作,离开本类之后就不能直接访问
-
不写(缺省):表示当前包私有,包访问权限,定义和调用只能在同一个包中,才能访问
-
protected:表示子类访问权限,同包中的可以访问,即使不同包但是有继承关系也可以访问
-
public:表示公共的,可以在当前项目中任何地方访问
10.2.1. JavaBean规范(重点掌握)
JavaBean是一种某些符合条件的特殊类,但是必须遵循一定的规范:
-
类必须使用public修饰
-
必须保证有公共无参数构造器,即使手动提供了带参数的构造器,也得手动提供无参数构造器
-
字段使用private修饰,每个字段提供一对getter和setter方法
需求:针对名为name的字段名来举例
getter方法:仅仅用于返回某一个字段的值
public String getName(){
return name; //返回name字段存储的值
}
如果操作的字段是boolean类型的,此时是is方法,把 getName 变成 isName。
setter方法:仅仅用来给某一个字段设置值
public void setName(String n){
name = n; //把传过来的参数n的值,存储到name字段中
}
注意:每一个字段都得使用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() {s
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);
}
}