类和面向对象
文章目录
一、面向对象
1、什么是面向对象
面向对象(Object Oriented Program,简称OOP)是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。Java是一门纯面向对象的语言。用面向对象的思想来涉及程序,更符合人们对事物的认知,对大型程序的设计、扩展以及维护都非常友好。
2、面向过程与面向对象
什么是面向过程
面向过程(Procedure-Oriendented Program,简称POP)是一种编程模型,由一系列要执行的计算步骤组成,通常采用自上而下、顺序执行的方式。编程时把解决问题的步骤分析出来,然后利用函数逐步实现,在一步一步的具体步骤中再按顺序调用函数。
面向过程常见的编程语言:C、Basic等。
比如说在C语言学习中的三子棋游戏:
第一步 初始化棋盘
第二步 玩家下棋
第三步 电脑下棋
第四步 判断
第五步 退出游戏
面向过程注重的是过程,但是代码的扩展和维护比较麻烦。
而面向对象以"对象"为中心思想,把要解决的问题分成各个对象,建立对想的目的不是通过对象完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
3、面向对象的特征
面向对象三大特征:封装、继承、多态。而类和对象阶段主要研究封装。
二、类的定义和使用
1、什么是类
简单来说类就是对一个对象的描述,主要包括对象的属性和对象的行为(方法)。
2、类的定义
//创建一个类 class TestClass{ field;//字段(属性) 或者 成员变量 method;//行为 或者 成员方法 }
class为定义类的关键字,TestClass为类名,{}中的为类的主体。。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类
具有哪些功能,称为类的成员方法。
例如定义一个狗类
public class Dog{ //狗的属性 public String Name; public String Gender; public int age; public String Color; //狗的行为 public void eat(){ System.out.println(name+"吃狗粮~~~"); } public void sleep(){ System.out.println(name+"在睡觉~~~"); } public void braks(){ System.out.println(name+"汪汪汪~~~"); } }
注意
- 类名采用大驼峰定义
- 一般一个文件当中只定义一个类
- main方法所在的类一般要使用public修饰
- public修饰的类必须和文件名相同
3、类的实例化
首先什么类的实例化
当我们定义了一个类时,就相当于在计算机中定义了一种新的类型(好比在C语言中创建了一个结构体),与int,double类型类似。
用类 类型创建对象的过程,称为类的实例化,在Java中通过采用new关键字,配合类名来实例化对象。
public static void main(String[] args) { Dog d=new Dog(); //访问属性 d.Name="小黑"; d.Gender="母"; d.age=3; d.Color="黑"; //访问方法 d.eat(); d.sleep(); d.barks(); } //输出结果 // 小黑吃狗粮~~~ // 小黑在睡觉~~~ // 小黑汪汪汪~~~
注意
- new关键字用于创建一个对象的实例
- 使用 . 来访问类的属性和方法
- 同一个类可以创建多个实例
4、类和对象
- 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类的成员.
- 类是一种自定义类型,可以用来定义变量.
- 一个类可以实例化多个对象.
- 类实例化出的对象好比现实中使用建筑设计图建造出的房子,类就好比设计图.
三、this引用
1、为什么要用this引用
public class Dog{ //狗的属性 public String Name; public String Gender; public int age; public String Color; public void setDog(String N, String G, int a, String c){ Name=N; Gender=G; age=a; Color=c; } }
通过调用setDong方法对对象进行设置。那如果是下面代码时编译器该如何处理
public void setDog(String Name, String Gender, int age, String color){ Name=Name; Gender=Gender; age=age; Color=color; }
那函数体中到底是谁给谁赋值?这就需要用this引用来解决。
2、什么是this引用
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
在成员方法中所有成员变量的操作,都是通过this引用去访问。只不过用户不需要来传递,编译器自动完成。
因此上面的setDog方法可以修改为
public void setDog(String N, String g, int a, String c){ this.Name=Name; this.Gender=Gender; this.age=age; this.Color=color; }
3、this引用的特征
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在非静态成员方法中使用
- this引用的指向不能修改
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
对象的引用传递给该成员方法,this负责来接收,编译器编译之后将"成员方法"的隐藏的this还原。
四、对象的构造及初始化
1、构造方法
a、概念
构造方法(也称构造器)是一种特殊的构造方法,,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
b、特性
- 名字必须与类名相同
- 没有返回值,设置成void也不行
- 由编译器自动调用,且在整个对象的生命周期内只调用一次。
- 构造方法可以重载
public class Dog { public String name; public String gender; public int age; public String color; //无参构造方法 public Dog(){ this.name = "小黑"; this.gender = "母"; this.age = 3; this.color = "黑"; } //带参数的构造方法 public Dog(String name, String gender, int age, String color) { this.name = name; this.gender = gender; this.age = age; this.color = color; } public void printDog(){ System.out.println(this.name +" "+this.gender+" "+this.age+" "+this.color); } public static void main(String[] args) { Dog Dog=new Dog(); Dog Dog1=new Dog("小七","公",2 ,"金黄色"); Dog.printDog(); } }
- 当用户未显示定义,编译器会生成一份无参的默认构造方法(一旦用户定义,编译器则不再生成)
- 构造方法中可以通过this调用其他构造方法来简化代码
public class Dog { public String name; public String gender; public int age; public String color; //无参构造方法 public Dog(){ this("小黑","母",3,"黑"); //this.name = "小黑"; //this.gender = "母"; //this.age = 3; //this.color = "黑"; } //带参数的构造方法 public Dog(String name, String gender, int age, String color) { this.name = name; this.gender = gender; this.age = age; this.color = color; } public void printDog(){ System.out.println(this.name +" "+this.gender+" "+this.age+" "+this.color); } public static void main(String[] args) { Dog Dog=new Dog(); Dog Dog1=new Dog("小七","公",2 ,"金黄色"); Dog.printDog(); } }
注意:
- this(……)引用必须放在第一句
- 不能形成环
public Dog() { this("小黑", "母", 3, "黑"); } public Dog(String name, String gender, int age, String color) { this(); } //报错:构造方法被递调用
2、默认初始化
当我们在定义局部变量时必须要对局部变量进行初始化,而成员变量可以不用初始化,这是为什么呢?
在new对象时,JVM层面会做好多事情
- 检测对象对应的类是否加载
- 为对象分配空间
- 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突 - 初始化所分配的空间
即:对象空间申请好后,对象中成员也设置好了初始值
数据类型 | 默认值 |
byte | 0 |
char | ‘/0000’ |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
引用类型 | null |
- 设置对象头信息
- 调用构造方法,给对象中的成员赋值
3、就地初始化
在声明成员变量时,就直接给了初始值。
public class Dog { public String name="小黑"; public String gender="母"; public int age=3; public String color="黑"; }
代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
oat | 0.0f |
| double | 0.0 |
| 引用类型 | null |
- 设置对象头信息
- 调用构造方法,给对象中的成员赋值
3、就地初始化
在声明成员变量时,就直接给了初始值。
public class Dog { public String name="小黑"; public String gender="母"; public int age=3; public String color="黑"; }
代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中