面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
面向对象:当需要实现一个功能的时候,不关系具体的步骤,而是找一个已经具有该功能的人帮忙做事情。
面向过程强调步骤,面向对象强调对象(结果)。
面向对象的思想更加符合我们思考的习惯,它可以将复杂的事情简单化,并且将我们从执行者变成了指挥者。
面向对象的语言中包含了三大基本特征:封装、继承和多态。
类和对象
类
类是一组相关属性和行为的集合。可以把类看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
现实中描述一类事物主要从两个方面:
1. 属性:该事物的状态信息
2. 行为:该事物能够做什么
对象
对象是一类事物的具体体现,对象是类的一个实例,必然具备该类事物的属性和行为。
类和对象的关系
类是对一类事物的描述,是抽象的
对象是一类事物的实例,是具体的
类是对象的模板,对象是类的实例
例如:现在定义一个类来模拟“学生”事物,那么其中就有两个组成部分:
★ 属性(是什么)
姓名 、年龄
★ 行为(能做什么)
吃饭 、睡觉 、学习
对应到java的类当中:
★ 成员变量(属性)
String name ;
int age ;
★ 成员方法(行为)
public void eat(){ }
public void sleep(){ }
public void study(){ }
注意:1. 成员变量是直接定义在类当中的,在方法外边
2. 成员方法不要写static关键字
通常情况下一个类并不能直接使用,需要根据类创建一个对象才能使用:
1. 导包:即指出需要使用的类在什么位置
import 包名称.类名称
对于和当前类属于同一个包的情况,可以省略导包语句不写
2. 创建
格式: 类名称 对象名 = new 类名称() ;
Student stu = new Student() ;
3. 使用:分为两种情况
★ 使用成员变量 :对象名.成员变量名
★ 使用成员方法:对象名.成员方法名(参数)
注意:如果成员变量没有进行赋值,则会有一个默认值,规则和数组一样
当一个对象作为参数传递到方法当中去时,实际上传递进去的是对象的地址。
当使用对象作为方法的返回值时,实际上返回的是对象的地址。
局部变量和成员变量
1. 定义的位置不一样(重要)
局部变量:在方法的内部
成员变量:在方法的外部,直接写在类当中
2. 作用的范围不一样(重要)
局部变量:只有在方法中才可以使用,出了方法就不可以再使用
成员变量:整个类都可以通用
3. 默认值不一样(重要)
局部变量:没有默认值,如果想要使用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,默认值的规则和数组一样
4. 内存的位置不一样(了解)
局部变量:位于栈内存
成员变量:位于堆内存
5. 生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象的创建而诞生,随着对象被垃圾回收而消失
【有static的是普通方法,普通方法直接调用;没有static是成员方法,成员方法要通过对象来调用】
面向对象三大特征:封装 、继承 、多态
--- 封装性在Java中的体现:
1. 方法就是一种封装
2. 关键字private也是一种封装
【 封装就是将一些细节信息隐藏起来,对于外界不可见 】
--- 封装的好处在于可以取到保护代码和数据的作用,增强了代码的安全性,同时也让代码更容易理解与维护。
封装的操作 -- private关键字
private使用格式: private 数据类型 变量名 ;
一旦使用了private进行修饰,则本类当中仍然可以随意访问,但是超出了本类范围之外就不可以直接访问成员变量了,但是可以间接访问,间接访问private成员变量是通过定义一对Getter / Setter 方法
其中命名规则必须是:setXX 或 getXX
对于Getter来说 ,不能有参数 ,返回值类型和成员变量对应
对于Setter来说 , 不能有返回值,参数类型和成员变量对应
public class Student {
private String name ;
private int age ;
public void setName(String n){
name = n ;
}
public String getName(){
return name ;
}
}
this 关键字
this的含义:this代表所在类的当前对象的引用(地址值)
当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量,如果此时需要访问本类当中的成员变量,需要使用格式: this.成员变量名 【this帮助在重名的情况下起到区分的作用】
【记住:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。】
构造方法
--- 当一个对象被创建的时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。
( 即专门用来创建对象的方法,当通过关键字new来创建对象时,其实就是在调用构造方法 )
【无论是否定义构造方法,所有的类都有构造方法,因为java自动提供一个无参数构造方法,一旦自己定义了构造方法,java自动提供的默认无参数构造方法就会失效 】
--- 格式: public 类名称(参数类型 参数名称){
方法体;
}
public class Student {
private String name ;
private int age ;
// 无参数的构造方法
public Student(){
}
// 有参数的构造方法
public Student(String name , int age){
this.name = name ;
this.age = age ;
}
}
--- 注意:
1. 构造方法的名称必须和所在类的名称完全一样,连大小写也要一样
2. 构造方法不用写返回值类型,连void都不用写
3. 构造方法不能return一个具体的返回值
4. 如果没有编写任何的构造方法则编译器会赠送一个构造方法,赠送的构造方法没有参数,
方法体什么都不做
public Student(){ }
5. 一旦编写了至少一个构造方法则编译器将不会再赠送构造方法
6. 构造方法也是可以进行重载的
重载:方法名称相同,参数列表不同
全参数构造方法的好处在于可以直接将现存的数据传入而不使用Setter方法,但如果要修
改数据还是要Setter方法(获取还是要用Getter方法)
标准代码 -- JavaBean
JavaBean 是 java 语言编写类的一种标准规范
一个标准的类通常要拥有下面四个组成部分:
1. 所有的成员变量都要使用private关键字修饰
2. 为每一个成员变量编写一对Getter/Setter方法
3. 编写一个无参数的构造方法
4. 编写一个全参数的构造方法
以学生类为例编写符合 JavaBean 规范的类 ,标准代码如下:
public class Student{
// 成员变量
private String name ;
private int age ;
// 构造方法
public Student(){}
public Student(String name , int age ){
this.name = name ;
this.age = age ;
}
// 成员方法
public void setName(String name){
this.name = name ;
}
public String getName(){
return name ;
}
public void setAge(int age){
this.age = age ;
}
public int getAge(){
return age ;
}
}
测试类代码如下:
public class TestStudent{
public static void main(String[] args){
// 无参数构造使用
Student s = new Student() ;
s.setName("小池") ;
s.setAge(22) ;
System.out/println(s.getName() + "-----" + s.getAge()) ;
// 带参数构造使用
Student st = new Student("小君",22);
System.out.println(st.getName() + "-----" + st.getAge()) ;
}
}