OOP
面向过程(Procedure Oriented)
按自顶向下的步骤依次执行的过程式解决方法,每个步骤可定义为一个模块
优点:性能高,流程和步骤清晰,容易理解
不足:复用率低,扩展性差,维护难度高
面向对象(Object Oriented)
将构成问题的事物拆解成各个对象,建立对象的目的是为了描述每个事物在整个解决问题步骤中的行为
优点:易扩展、代码复用率高、利于后期扩展和维护,提升开发效率
不足:一定程度上增加系统开销
面向对象编程:(Object-Oriented Programming);简称OOP
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装) 数据
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起
对象是具有类,类型的变量。类和对象是面向对象编程技术中的最基本的概念
package CH05_JAVAObjectOriented;
//类与对象的创建
public class XZ01_Student {
// 学生类
String name;
// 默认值 null
int age;
// 默认值 0
public void study() {
System.out.println(this.name + "在学习");
// this 代表当前类的属性
}
}
package CH05_JAVAObjectOriented;
//一个项目应该只存在一个 Main 方法
public class XZ01_Main {
public static void main(String[] args) {
//类:抽象的,实例化
//类实例化后会返回一个自己的对象!
XZ01_Student xiaoMing = new XZ01_Student();
// 使用new关键字创建对象
System.out.println(xiaoMing.name);
System.out.println(xiaoMing.age);
xiaoMing.study();
XZ01_Student xiaoHong = new XZ01_Student();
System.out.println("------------------------");
xiaoHong.name = "小红";
// 对属性进行赋值
xiaoHong.age = 16;
System.out.println(xiaoHong.name);
System.out.println(xiaoHong.age);
xiaoHong.study();
//xiaoHong,xiaoHong就是一个Student类的具体实例!
}
}
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下特点:
方法名和类名相同
没有返回值类型
一旦自定义构造方法,系统将不再提供默认无参构造方法
package CH05_JAVAObjectOriented;
public class XZ02_Constructors {
//一个类即使什么都不写,它也会存在一个方法
//显示的定义构造器
String name;
public XZ02_Constructors(String name) {
//有参构造:一旦定义了有参构造,无参就必须显示定义
//只要定义了有参构造就也定义个无参构造
this.name = name;
}
public XZ02_Constructors() {
this.name = "玄子";
}
}
package CH05_JAVAObjectOriented;
public class XZ02_Main {
public static void main(String[] args) {
XZ02_Constructors constructors = new XZ02_Constructors("玉玉诏");
System.out.println(constructors.name);
// 这里看不懂可尝试 Debug 一下
}
}
快捷键: Alt + Instant
笔记本用户根据自己机型考虑加上 Shift
即同时按下 Alt + Shift + Instant
this
关键字是对一个对象的默认引用
调用成员变量
调用成员方法
调用已定义的构造方法
this 关键字是在对象内部指代自身的引用,所以它
只能调用实例变量、实例方法和构造方法
,不能调用类变量和类方法,也不能调用局部变量
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
package CH03_JAVAMethod;
//方法的重载
public class XZ02_OverloadingOfMethod {
public static void main(String[] args) {
// 声明变量x和y接收用户输入变量
int result = add(10, 20, 30);
int result2 = add(10, 20);
double result3 = add(10, 20, 30.6, 40);
// 方法名相同,根据传递参数数量,类型不同自动判断
System.out.println("和为:" + result);
System.out.println("和为:" + result2);
System.out.println("和为:" + result3);
// 输出返回值
}
public static int add(int x, int y) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y;
// 方法体
return result;
// return 返回值;
}
public static int add(int x, int y, int z) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y + z;
// 方法体
return result;
// return 返回值;
}
public static double add(double x, double y, double z, double n) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
double result = 0;
// 声明变量返回结果
result = x + y + z + n;
// 方法体
return result;
// return 返回值;
}
}
方法重载是指
同一个类中
包含了两个或两个以上的方法,它们的方法名相同,方法参数的个数或参数类型不同
类的成员方法和构造方法都可以进行重载
package CH05_JAVAObjectOriented;
//封装
public class XZ03_Encapsulation {
private String name;
private int age;
private char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 为了避免赋值错误,需对属性设置限制,在set()方法中进行验证
if (age >= 100) {
System.out.println(age + ":为非法数据");
this.age = 18;
} else {
// this代表当前对象
this.age = age;
}
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
package CH05_JAVAObjectOriented;
public class XZ03_Main {
public static void main(String[] args) {
XZ03_Encapsulation encapsulation = new XZ03_Encapsulation();
encapsulation.setName("玄子");
encapsulation.setAge(12);
encapsulation.setSex('男');
System.out.println(encapsulation.getName());
System.out.println(encapsulation.getAge());
System.out.println(encapsulation.getSex());
System.out.println("------------------");
XZ03_Encapsulation encapsulation2 = new XZ03_Encapsulation();
encapsulation2.setAge(112);
System.out.println(encapsulation2.getAge());
}
}
将类的某些信息隐藏在类内部,不允许外部程序直接访问
而是通过该类提供的方法来实现对隐藏信息的操作和访问
将属性私有通过
get/set
方法操作属性
快捷键: Alt + Instant
笔记本用户根据自己机型考虑加上 Shift
即同时按下 Alt + Shift + Instant
选择
Getter 或 Setter
类的访问修饰符
修饰符 \ 作用域 | 同一包中 | 非同一包中 |
---|---|---|
public | 可以使用 | 可以使用 |
默认修饰符 | 可以使用 | 不可以使用 |
类成员的访问修饰符(属性、方法)
修饰符 \ 作用域 | 同一类中 | 同一包中 | 子类中 | 外部包 |
---|---|---|---|---|
private | 可以使用 | 不可以使用 | 不可以使用 | 不可以使用 |
默认修饰符 | 可以使用 | 可以使用 | 不可以使用 | 不可以使用 |
protected | 可以使用 | 可以使用 | 可以使用 | 不可以使用 |
public | 可以使用 | 可以使用 | 可以使用 | 可以使用 |
public class Student {
public static String name;
}
public class Main {
public static void main(String[] args) {
Student.name ="玄子";
//通过类名直接调用,不需再消耗资源反复创建对象
}
}
使用static修饰的属性称为静态变量或类变量
没有使用static修饰的属性称为实例变量
程序中的类信息只会加载一次
每次用new 来创建对象的时候都会分配一个新的空间来保存相关的非静态字段信息
静态成员属于类级别的,为所有的对象所共享,不单独属于某一个对象, 所以调用静态成员要用类名来调
在静态方法的定义中只能调用静态的方法和静态的字段或属性
static代码块在JVM初始化阶段执行,只会执行一次一般情况下, 使用static代码块对static变量进行初始化
方法里,不可以定义static变量,即:
类变量不能是局部变量
public class Student {
public static String name;
public final int Age = 18;
}
public class Main {
public static void main(String[] args) {
Student student = New Student();
//student.age=20;
}
}
static 非private修饰 |
非static private修饰 |
|
---|---|---|
属性 | 类属性 类变量 |
实例属性 实例变量 |
方法 | 类方法 | 实例方法 |
调用方式 | 类名.属性 类名.方法() 对象.属性 对象.方法() |
对象.属性 对象.方法() |
归属 | 类 | 单个对象 |
在静态方法中,不能直接访问实例变量和实例方法
在实例方法中,可以直接调用类中定义的静态变量和静态方法
BCSP-玄子JAVA开发之面向对象编程CH01_对象和封装笔记