文章目录
一、面向对象VS面向过程
面向过程
是一种以过程为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调 用。
面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我 们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。
面向对象
是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问 题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。
如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。
OOP的优点
- 与人类的思维习惯一致
把人类解决问题的思维过程转变为程序能够理解的过程 - 信息隐藏,提高了程序的可维护性和安全性
封装实现了模块化和信息隐藏
封装使得在对象外部不能随意访问对象的属性和方法 - 提高了程序的可重用性
一个类可以创建多个对象实例,增加了重用性
二、对象
属性
对象具有的各种特征
方法
对象执行的操作
对象
用来描述客观事物的一个实体,由一组属性和方法组成(真实存在的具体实例)
三、类
具有相同属性和方法的一组对象的集合(对象共同特征的描述)
在java中,必须先设计类,才能创建对象并使用。
1、封装(面向对象三大特征之一)
解决属性和方法属于哪个对象的问题
- 对象同时具有属性和方法两项特性。
- 对象的属性和方法通常被封装在一起,共同体现事务的特性,二者相辅相成,不能分割。
2、定义类
1. 如何设计类
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)
3.构造器
4.代码块
5.内部类
}
2. 如何得到类对象
类名 对象名 = new 类名();
3. 如何使用对象
访问属性:对象名.成员变量
访问行为:对象名.方法名()
4. 补充注意事项
- 类名首字母建议大写,满足“驼峰模式”,不能用关键字,必须是合法标识符,且有意义。
- 一个java文件中可以定义多个class类,但只能有一个类是public修饰,而且public修饰的类名必须成为代码文件名。注意:实际开发中建议一个代码文件只定义一个类。
- 成员变量的完整定义格式是:
// 一般无需指定初始化值,存在默认值。
修饰符 数据类型 变量名称 = 初始化值;
四、方法
1、一个参数的方法
a、方法定义
修饰符 返回值 方法名(数据类型 参数1,数据类型 参数2…){
}
b、方法调用
// 注意:调用方法,传递的参数要与参数列表一一对应
对象.方法名(实参,实参);
总结补充
1.定义类时要考虑解耦合,避免耦合度太高。
2.重复的代码片段可以抽取成单独的方法,提高代码的复用率。
3.在抽取方法时,要注意方法的返回值类型以及是否携带参数。
4.在调用含参的方法时,要注意参数的使用范围
5.在调用不同方法时,如果会对同一个数据源进行操作,需要保证改数据源是全局变量或者封装为一个对象。
2、可变参数
可变参数必须在参数列表的最后一个
public class Test01 {
public static int getSum(int... num) {
int sum = 0;
for (int i : num) {
sum += i;
}
return sum;
}
public static int getSum01(int[] num){
int sum =0;
for (int i : num) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
int sum = getSum(10, 20, 30);
System.out.println("数组之和为:" + sum);
int sum1 = getSum01(new int[]{100, 20, 30});
System.out.println("数组之和为:" + sum1);
}
}
五、包装类
1、拆箱与装箱
int a = 10;
// 装箱
Integer b = new Integer(a);
// 拆箱
int c = b.intValue();
// 自动装箱
Integer b1 = a;
// 自动拆箱
int c1 = b1;
六、方法重载
调用者: 只关心功能,不关心参数列表及返回值类型!!!
方法名相同,参数列表必须不同,返回类型可以不同
编译器处理重载方法的顺序
- 寻找在还没有装箱动作前可以符合参数个数与类型的方法
- 尝试装箱动作后可以符合参数个数与类型的方法
- 尝试没有不定长度参数并可以符合的方法
- 都找不到适合的方法就报告编译错误
public class TestOrder {
public static void print(int a) {
System.out.println("方法一" + a);
}
public static void print(Integer a) {
System.out.println("方法二" + a);
}
public static void print(int... a) {
System.out.println("方法三" + Arrays.toString(a));
}
public static void print(Integer... a) {
System.out.println("方法四" + Arrays.toString(a));
}
public static void main(String[] args) {
print(2);
print(new Integer(3));
print(new int[]{2, 3, 4});
print(new Integer[]{1, 2, 3});
}
}
七、构造方法(构造器)
1、构造器的作用
- 定义在类中,可以用于初始化一个类的对象,并返回对象的地址。
2、构造器的格式
public class Car{
...
//无参构造器
public Car(){
...
}
//含参构造器
public Car(String n,double p){
...
}
}
3、调用构造器得到对象的格式
类 变量名称 = new 构造器;
4、构造器的分类和作用
- 无参构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。
- 有参构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值。
八、封装(面向对象三大特征之一)
1、封装的概念
将类的某些信息隐藏在类内部。不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
2、封装的好处
- 只能通过规定方法访问数据
- 隐藏类的实现细节
- 方便加入控制语句
- 方便实现修改
3、this关键字
代表当前对象的地址
public class Dog {
private String name;
private String strain;
private int age;
public Dog() {
}
public Dog(String name, String strain, int age) {
// 如果调用构造方法,必须是构造方法中的第一条语句
this();
// 调用属性
this.name = name;
this.strain = strain;
this.age = age;
}
public void eat() {
// 调用方法
this.play(1);
System.out.println(name + "是" + age + "岁的" + strain + ",喜欢吃骨头");
}
public void play(int n) {
int localV = 0;
age = age - n;
System.out.println(name+"\t"+localV +""+ age);
}
}
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog("大黄","田园犬",4);
dog.eat();
Dog dog1 = new Dog();
dog1.setName("H");
dog1.setStrain("柴犬");
dog1.setAge(5);
dog1.eat();
}
}
运行结果