面向对象
面向对象编程思想:将程序模块化的思想。
-
什么是面向对象?
面向对象编程思想诞生之前,程序开发采用的是面向过程的结构化编程方式,是一种面向功能划分的软件结构。
最小粒度细化到方法这一层。
面向过程注重的是每一个步骤,面向对象关注点在于整件事情的模块化结构。
-
类和对象
类和对象的关系
每个对象都有特定的特征:1、属性。2、方法。
属性指的是对象的静态特征,方法用来描述对象的动态特征。
对象是用来描述客观存在的一个实体,改实体是由一组属性和方法构成。
类是与对象紧密结合的另外一个概念,类是产生对象的模版,所有的对象都是通过类来创建的。
二者的关系:类是对象的抽象化描述,这些对象具有相同的特征和动作(属性和方法)。
对象是类的具体实例。
Java 程序是以类位组织单元,程序运行时的主体是通过类创建的具体对象。
定义类
public class 类名{ //定义属性,属性名符合驼峰式命名法 public 数据类型 属性名; //定义方法,方法名符合驼峰式命名法 public 返回值类型 方法名(参数列表:数据类型 参数名){ //方法体 } }
Java 关于返回值的定义分为两类:有返回值和无返回值,有返回值的方法需要在方法定义时指定返回值的数据类型,并在方法体中用 return 将结果返回给外部调用者,加法运算。
如果一个方法不需要进行返回操作,将返回值类型定义为 void。
参数列表是指外部在调用该方法时需要传入到方法内部进行运算的数据。
构造函数、构造方法、构造器
构造函数是一种特殊的方法,普通方法是用来描述某个动作的,构造方法是用来创建对象的。
-
方法名必须与类名一致。
-
不需要定义返回值类型。
构造函数可分为有参构造和无参构造,有参构造是指带参数的构造函数,无参构造是指没有参数的构造函数。
任何一个类都默认自带一个无参构造函数,如果手动在类中定义一个有参构造,则会覆盖默认的无参构造。
this 关键字
this 用来指代当前类的实例化对象,通过 this 可以调用当前类的属性和方法,比如在有参构造中,通过 this 将外部传入的值赋给当前类的实例化对象。
this 除了可以在类中访问属性也可以在类中调用方法,类中的方法可以分为两类:构造方法、普通方法。
用 this 调用这两类方法的语法也不同,调用构造函数的语法是 this(参数列表),不能在普通方法中使用 this 调用构造函数。
用 this 调用普通方法,this.方法名(参数列表),可以在构造函数中使用,也可以在普通方法中使用。
成员变量和局部变量
变量的作用域是指在程序中可以通过变量名来访问该变量的范围,变量的作用域由变量被声明时所在位置决定的,Java 中根据不同的作用域可以将变量分为成员变量和局部变量。
局部变量:如果一个变量在方法中声明,则该变量是局部变量。
成员变量:如果一个变量在方法外,类中声明,则该变量是成员变量。
public class HelloWorld{ int num2 = 2; public int test(){ int num1 = 1; } }
1、成员变量和局部变量的区别在于作用域不同,成员变量的作用域在整个类中,类中的每个方法都可以访问该变量,局部变量的作用域只在定义该变量的方法中,出了方法体就无法访问。
2、成员变量和局部变量的初始值也不同,局部变量不会赋初始值,成员变量会赋初始值,具体的值是由成员变量的数据类型决定的。
封装
封装是指将类的属性隐藏在内部,外部不能直接访问和修改,如何实现?通过修改成员变量的可见性,从公有改为私有。
public class Student { private int id; private String name; private int age; public void show() { System.out.println("学生信息如下:"); System.out.println("学生编号:"+id); System.out.println("学生姓名:"+name); System.out.println("学生年龄:"+age); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if(age <= 0) { System.out.println("输入的数值有误!"); age = 18; } this.age = age; } }
封装的核心思想就是尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。
封装的步骤:
-
修改属性(成员变量)的访问权限为私有,使得外部不能直接访问。
-
提供外部可以直接调用的方法。
-
在该方法中加入对于属性的逻辑控制,避免出现逻辑上的错误。
什么是访问权限?
访问权限是指该属性可以被直接访问的范围,是在属性定义时设定的,访问权限的可选项一共有 4 种:public、private、默认(不写)、protected,区别在于作用域范围不同。
static
static 表示静态或者全局,可以用来修饰成员变量和成员方法以及代码块。
使用 static 修饰的成员变量和成员方法独立于该类的任何一个实例化对象,访问时不依赖于该类的对象,而是直接通过类去访问,可以理解为被该类的所有实例对象所共用,所以说是全局的。
static 还可以修饰代码块,被 static 修饰的代码块叫做静态代码块。
static { System.out.println(1); }
静态代码块的特点是只执行一次,什么时候执行?当这个类被加载到内存时执行,不需要开发者手动调用,会自动执行。
被加载到内存中的类叫做运行时类,静态代码块就是在家中类的时候执行的,因为类只加载一次,所以静态代码块也只执行一次。