面向对象
1.面向对象
1.1概述
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
↑百度百科的↑
1.2面向对象和面向过程
所谓面向对象和面向过程,我的理解就是比如做包子。面向过程就是想吃包子。然后自己做包子(拌馅→擀皮→包起来→蒸熟)一气呵成,最终做熟一个包子,后来又想吃个饺子(拌馅→擀皮→包起来→煮熟)。而面向对象就是第一个人专门拌馅,第二个人专门擀皮,第三个人专门包起来,第四个人专门弄熟;我想吃包子第四个人就给我一个熟包子,我想吃饺子第四个人就给我一个熟饺子。
不过可能馅不是自己喜欢吃的。
面向过程:侧重分步骤
比如要做一件事的时候先分析第一步做什么,第二步做什么
面向对象:侧重分模块
比如要做一件事的时候,分析出这件事应该交给谁去做。
总结:
面向对象优势:可扩展性,可维护性,灵活性,使程序耦合度降低
缺点:性能比面向过程相对较差
1.3构造方法
每个类都有,用于创建该类对象,如果该类中没有编写构造方法,那么编译器自动生成一个无参构造方法,如果该类中编写了构造方法,无论有无参数,默认的无参构造都不再生成。(所以写有参构造的时候,最好手写一个无参构造)
构造方法语法结构:
//修饰符 方法名(必须和类名相同) (参数列表){
方法体
}
//修饰符只用权限修饰符即可,不能使用static
//真的真的没有返回值,不是void,而是字面意思不要声明返回值类型
//声明了就是成员方法
//方法名必须和类名一致
// 默认的无参构造
public class Test {
public static void main(String[] args) {
Test test1 = new Test();//自动调用构造方法
System.out.println(test1);
}
}
//编写构造方法
public class Test {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test();//会报错
System.out.println(test1);
}
public Test(int i) {
System.out.println("有参构造方法");
}
}
下面重写带参数的构造方法同时再写一个无参构造方法
public class Test {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test();
System.out.println(test1);
System.out.println(test2);
}
public Test(int i) {
System.out.println("有参构造方法");
}
public Test() {
System.out.println("无参构造方法");
}
}
1.4类和对象、实例化
类:描述了这一类事物的属性和特征,进而抽象出的模板
对象:某一个具体的事物,是类的实现,保存了属性的值
在编程中,通过需求或现实事物的属性和特征来定义相关的类,通过不同的属性值来定义不同的对象
如果对象和对象之间有相同的属性共享的值,就使用静态变量,如果相同的属性不共享的值,就使用成员变量
实例化:
1.加载对应类文件
2.new在堆内存创建空间
3.执行构造方法,对堆内存对象进行初始化
4.构造方法弹栈,并把堆内存地址返回给变量 s1,s2,s3
//Student.java
public class Student {
// 国籍,假如全是中国人
static String country = "中国";
// 姓名
String name;
// 学号
int id;
// 性别
boolean sex;
}
//更改成员变量
public class Test {
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);
}
}
//更改静态成员
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1:" + s1.country);
Student s2 = new Student();
System.out.println("s2:" + s2.country);
s1.country = "China";
System.out.println("s2:" + s2.country);
Student s3 = new Student();
System.out.println("s3:" + s3.country);
}
}
1.5javaBean
就是公共的类,私有化的属性,公共的获取属性的方法(getter/setter),公共的无参构造
//Number.java
public class Number {
private int i = 0;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
public class Test {
public static void main(String[] args) {
Number num = new Number();
num.i=5;//报错
System.out.print(num.i);//报错
}
}
public class Test {
public static void main(String[] args) {
Number num = new Number();
// num.i=5;
// System.out.print(num.i);
num.setI(5);
System.out.print(num.getI());
}
}
1.6常见异常
空指针异常:使用null访问成员属性
public class Test {
public static void main(String[] args) {
Number num = new Number();
num = null;
System.out.print(num.getI());
}
}
1.7对象调用静态属性
//调用静态属性使用类名调用
public class Test {
static int i = 10;
public static void main(String[] args) {
Test t1 = new Test();
System.out.println(Test.i);
System.out.println(t1.i);
}
}
易错点
1.静态调用成员
//静态方法中,无法直接使用非静态属性
//需要使用对象调用才行
public class Test {
static int a = 1;
int b = 2;
public static void main(String[] args) {
System.out.println(b);
}
}
public class Test {
static int a = 1;
int b = 2;
public static void main(String[] args) {
// System.out.println(b);
System.out.println(new Test().b);
}
}
2.传值和传址(真的很易错)
public class Test {
int j = 0;
public static void main(String[] args) {
// 基本数据类型传值
int i = 0;
add(i);
System.out.println("main->i=" + i);
// 引用数据类型传址
Test test = new Test();
System.out.println("调用add之前j=" + test.j);
add(test);
System.out.println("调用add之后j=" + test.j);
}
public static void add(int i) {
i++;
System.out.println("add->i=" + i);
}
public static void add(Test a) {
a.j++;
}
}
1.3区分成员方法和构造方法
构造方法没有返回值!void都没有,且和类名一样
public class Test {
int i = 0;
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test(8);//会报错
}
public void Test(int i) {
this.i = 5;
}
}
public class Test {
int i = 0;
public static void main(String[] args) {
Test t1 = new Test();//会报错
Test t2 = new Test(8);
System.out.println(t2.i);
}
//成员方法可以和类名相同
public void Test(int i) {
this.i = 5;
}
public Test(int i) {
this.i = 5;
}
}