1 概述
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
2 面向对象和面向过程
面向过程 : 侧重分步骤
比如要做一件事的时候,先进行分析
第一步应该做什么
第二步应该做什么
......
面向对象 : 侧重分模块
比如要做一件事的时候,分析出这件事应该交给谁去做
总结 :
面向有对象优势 : 可扩展性,可维护性,灵活性,使程序耦合度降低
缺点 : 性能比面向过程相对较差
3 静态与成员
package _01_Contructor;
public class Contructor_01 {
public static void main(String[] args) {
//静态属性调用
//类名.静态变量 / 对象.成员方法(参数)
//调用当前类中的静态属性,类名可以省略
Contructor_01.m1();
m1();
//成员属性调用
//对象.成员变量 / 对象.成员方法(参数)
//加前缀是为了方便找到
//创建对象
//new 在堆内存创建对象空间
//Contructor()是在调用构造方法
Contructor_01 c = new Contructor_01();
c.m2();
}
public static void m1() {
System.out.println("静态方法");
}
public void m2() {
System.out.println("成员方法");
}
}
4 构造方法
package _01_Contructor;
/**
* 构造方法 是每个类都有的, 并且用于创建该类的对象
*
* 如果 该类中 没有编写构造方法 编译器会自动帮我们生成一个无参构造
*
* 如果该类中 编写了构造方法,不管写的是不是有参,则 默认的无参构造都不能自动生成
* 所以当我们在写有参构造的时候,可以手动编写一个无参构造
*
* 构造方法语法 : 修饰符 方法名/类名 (参数列表) {方法体}
* 够着方法的修饰符,我们值使用权限控制即可,不能使用static
* 构造方法没有返回值,void都没有
* 构造方法的方法名.必修和类名一致
* @author SEC90
*2022年1月8日上午11:35:04
*/
public class Contructor_02 {
public static void main(String[] args) {
//自动调用构造方法
Contructor_02 contructor_02 = new Contructor_02();
}
public Contructor_02() {
System.out.println("构造方法");
}
public Contructor_02(int n) {
System.out.println("构造方法");
}
}
5类和对象
package _02_OOP;
/**
* 对象:
* 对象就是某一个具体的事物
*
* 类:
描述了这一类事物的属性和特征,进行抽象出的模板
而,对象 就是类的实现,保存了属性的值
在编程中,通过需要或者实现事物的属性和特征,,来定义相关的类
通过不同的属性值来定义不同的对象
如果对象和对象之间 有相同的属性相同的值 就使用静态变量
如果对象和对象之间 有相同的属性不同的值(也可以不同) 就使用 成员变量
*
* @author SEC90
*2022年1月8日上午11:46:08
*/
public class OOP_01 {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "张三";
Student s2 = new Student();
s2.name = "李四";
System.out.println(s1.name);
System.out.println(s2.name);
}
}
5.1 学生类
public class Student {
//姓名
String name ;
//学号
int id;
//年龄
int age;
//性别
boolean sex;
//家庭住址
String home ;
}
6 实例化
/**
* 实例化:
1 加载对应类文件
2 new在堆内存创建空间
3 执行构造方法,对堆内存进行初始化
4 构造方法弹栈,并把堆内存地址返回给变量 student
*
* @author SEC90
*2022年1月8日下午2:12:39
*/
public class OOP_02 {
public static void main(String[] args) {
//数据类型 变量名 =值
int i = 123;
char c = 'a';
// 实例化,生成对象
// 变量
Student student = new Student();
// 字面量
new Student();
}
7 对象使用
//创建一个学生对象
Student student2 = new Student();
//成员变量赋值
student2.name = "www";
student2.age = 18;
//成员变量调用,取默认值
System.out.println(student2.age);
System.out.println(student2.home);
System.out.println(student2.id);
System.out.println(student2.name);
System.out.println(student2.sex);
8 Bean
就是公共的类,私有化的属性,公共的获取属性的方法(getter/setter),公共的无参构造
package _02_OOP;
public class Uer {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
private int id;
private String userName;
}
9 常见异常
//java.lang.NullPointerException
// student = null;
// //当使用null值 访问成员属性的时候, 会出现空指针异常
// System.out.println(student.age);
10 对象调用静态属性
//静态属性使用 类名调用
//为空也可以调用,有默认值
//也可以使用 对象调用 会把对象转换为类名调用,所以该变量 是不是null 是没有关的
System.out.println(Student.i);
System.out.println(student.i);
student = null;
System.out.println(student.i);
//静态变量用不同的对象调用 值没有影响
student.i = 18;
Student student2 = new Student();
System.out.println(student2.i ) ;
System.out.println(student.i );
11 注意事项
11.1静态调用成员
package _02_OOP;
/**
* 成员能直接访问静态
* 静态方法不能直接使用非静态变量
* 需要使用对象调用才行
*
* @author SEC90
*2022年1月8日下午3:31:25
*/
public class OOP_4 {
static int a = 10;
int b = 20;
public static void main(String[] args) {
OOP_4 o = new OOP_4();
o.b = 40;
o.m1();
}
//静态变量 : 对象之间共有的值和属性
//成员变量 :对象之间共有属性不同的值,但值可以相等
//成员方法: 方法中需要使用成员属性的时候,定义为成员方法
//静态方法 :方法中不需要使用成员属性的时候,定义为静态方法
public void m1() {
System.out.println(b);
System.out.println(a);
}
11.2 传值和传引用
package _02_OOP;
/**
* 注意传引用
*
* @author SEC90
*2022年1月8日下午4:03:32
*/
public class OOP_05 {
public static void main(String[] args) {
// int i = 10;
// m1(i);
// System.out.println("mian->"+i);
Animal a = new Animal(18);
m2(a);
System.out.println(a.age);
}
// public static void m1(int i) {
// ++i;
// System.out.println("m1->" + i);
// }
public static void m2(Animal a) {
a.age++;
System.out.println(a.age);
}
}
class Animal {
int age;
public Animal(int age_) {
age = age_;
}
}
11.3 区分成员方法和构造方法
package _02_OOP;
public class OOP_06 {
public static void main(String[] args) {
OOP_06 o1 = new OOP_06();
// OOP_06 o2 = new OOP_06(15);
}
//构造方法
public OOP_06() {
System.out.println("无参构造");
}
//成员方法,成员方法可以和类名相同
//如何分辨同名成员方法和构造方法,如果没有返回值,void也没有,就是构造方法
public void OOP_06(int i) {
System.out.println("有参构造");
}
}