面向对象
一、面向对象和面向过程的区别
让我们先来比较一下面向对象和面向过程
面向过程
面向过程更看重过程,按照步骤一步一步去完成,这个适合简单的事情,比如开车
点火–>挂挡–>踩油门–>起飞
面向对象
面向对象则是想着如何去设计,比如车,我们想着如何车是如何设计的,有什么部件组成,,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。
我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!**
二、类和对象
1.类和对象概念的总结
生活中,比如我们在街上可以看到各种各样的美女或者明星啊,看过她们,我们就会想什么样的是美女呢?然后我们就会去作总结。总结的过程就是抽象的过程,通过抽象我们发现美女有以下特征:
1.五官精致
2.前凸后翘
3.大长腿
那么通过总结美女,我们进行抽象,抽象出了天美女的特征,我们也可以归纳一个美女类。 通过这个过程,
类就是对象的抽象。
类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图
纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。
类:我们叫做class。 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。**
2.类的定义
做了关于对象的很多介绍,终于进入代码编写阶段。本节中重点介绍类和对象的基本定义,属性和方法的基本使用
方式。
2.1属性
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6Hw7Yoi-1593423815573)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200629171601101.png)]
属性定义格式
[修饰符] 属性类型 属性名 = [默认值] ;
String brand;// 品牌
String color;// 颜色
int speed;// 速度
2.2方法
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中
的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是
类,方法是从属于类和对象的。
方法定义格式
[修饰符] 方法返回值类型 方法名(形参列表) {
// n条语句
}
//例如
public void listen() {
System.out.println("会唱歌");
}
综合代码
package com.shsxt.day06;
/**
* 女人类
*/
public class Women {
// 属性
String name;// 名字
String hobby;// 爱好
int age;// 年龄
// 行为
public void listen() {
System.out.println(name + "会唱歌");
}
}
三、权限问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKOXLUv0-1593423815576)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200629172639547.png)]
今天主要学了private和public,剩下两个在后面学
package com.shsxt.day06;
/**
* 汽车类
*/
public class Car {
// 属性
private String brand;// 品牌
private String color;// 颜色
private int speed;// 速度
// 行为
public void run() {
System.out.println(brand + "车会跑");
}
// 提供一些公开的方法
public void setBrand(String b) {
brand = b;
}
public String getBrand() {
return brand;
}
}
想要访问私有变量,我们不能直接去访问,那我们怎么样才能去访问的到呢?
就比如你想知道别人的秘密,你直接去问,人家会告诉你吗。很明显,不会,只有人家告诉你才可以。所以我们要提供一些公开的的方法,比如set和get方法。
四、就近原则
因为程序的就近原则,我们有时编写的代码如果遵循了见名知意的约定就容易出现以下比较尴尬的情况,自己赋值给自己:
public void setBrand(String brand) {
brand = brand;
}
通过运行可以看到,其实就只有一个brand变量,我们类中的brand并没有被赋值。
所以我们得引入this关键字,才能区分brand
五、this关键字
为了避免这种情况的发生,Java语言提供了 this
关键字来区分类的变量(成员变量)和传入参数变量(局部变量)的区别。
this
表示当前正在运行的对象。
package com.shsxt.day06;
/**
* 汽车类
*/
public class Car {
// 属性
private String brand;// 品牌
private String color;// 颜色
private int speed;// 速度
// 行为
public void run() {
System.out.println(brand + "车会跑");
}
// 提供一些公开的方法
// get/set方法
public void setBrand(String brand) {
this.brand = brand;
}
public String getBrand() {
return this.brand;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return this.color;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getSpeed() {
return this.speed;
}
}
当然this不只是只有这一个作用,到后面我们还会学到还有别的作用,这里不细说。
六、构造方法
构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是
对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一
种特殊的方法。
格式声明
[修饰符] 类名(形参列表){
//n条语句
}
构造器4个要点:
1.构造器通过new关键字调用!!
2.构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回
某个值。
3.如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
4.构造器的方法名必须和类名一致!
新手雷区
对象的创建完全是由构造方法实现的吗?
[修饰符] 类名(形参列表){
//n条语句
}
不完全是。构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类
对象,但这个对象并不是完全由构造器负责创建的。创建一个对象分为如下四步:
- 分配对象空间,并将对象成员变量初始化为0或空
- 执行属性值的显示初始化
- 执行构造方法
- 返回对象的地址给相关的变量
- 根据类创建了对象以后,会默认有一个无参的构造器
- 如果自定义了构造器,则无参构造器会失效,按需改写
- 构造器可以重载
// 无参构造器
权限修饰符 类名() {
}
// 有参构造器
权限修饰符 类名(参数1, 参数2) {
}
package com.shsxt.day06;
/**
* 汽车类
*/
public class Car {
// 属性
private String brand;// 品牌
private String color;// 颜色
private int speed;// 速度
// 无参构造器
public Car() {
}
// 有参构造器-重载
public Car(String brand, String color, int speed) {
this.brand = brand;
this.color = color;
this.speed = speed;
}
// 有参构造器-重载
public Car(String brand, String color) {
this.brand = brand;
this.color = color;
}
// 有参构造器-重载
public Car(String brand) {
this.brand = brand;
}
// 行为
public void run() {
System.out.println(this.brand + "车会跑");
}
}
七、打印所有属性 toString()
public String toString() {
return "Car [品牌:" + this.brand
+ ",颜色:" + this.color
+ ",速度:" + this.speed + "]";
}
八、类的加载顺序
代码块的优先级高于构造器
static代码块优先级最高
九、static关键字
凡是静态的都是属于类的,与对象无关的,先于对象存在的。可用于修饰属性、方法、块。
public class TestStatic{
static int a;
static {
//静态初始化块
a = 333;
System.out.println("调用了静态初始化块");
}
static void aaa(){
System.out.println("aaaaa");
}
public static void main(String[] args){
System.out.println("执行 main 方法!");
TestStatic t = new TestStatic();
t.a = 3;
TestStatic t2 = new TestStatic();
System.out.println(t2.a+"-"+TestStatic.a);
TestStatic.aaa();
t.aaa();
}
}