Java基础
面向对象和面向过程编程思想及区别
面向过程和面向对象都是对软件分析,设计和开发的一种思想,它指导着人们以不同的方式去分析,设计和开发软件。对应面向对象就分别称为面向对象分析(OOA),面向对象设计(OOD),面向对象编程(OOP)。C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。
- 面向过程:按步骤实现,并将步骤对应成方法,一步一步完成。
比如开车:1.发动车 2.挂挡 3.踩油门 4.走
面向过程适合简单,不需要协作的事务 - 面向对象:怎么设计这个事务。
比如造车:车由轮胎,发动机,车壳,座椅,挡风玻璃组成。为了效率高,我们找轮胎厂制作轮胎,发动机厂制造发动机,最后进行组装。 - 面向对象有三大特征:封装性,继承性和多态性。而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能。
- 比喻:面向对象是盖浇饭,面向过程是蛋炒饭,盖浇饭的好处就是“菜”“饭”分离,提高了制作盖浇饭的灵活性,饭不满意就换饭,菜不满意就换菜,可维护性好,饭和菜的耦合性低。蛋炒饭将蛋和饭和在一起,想换任何一种都很难,耦合度很高,维护性差。
面向对象的三大特性
- 继承
继承的基本思想:基于已有的类创建新的类。继承已存在的类就是继承这些类的方法,而且可以增加一些新的方法和手段,使新类能够适应新的情况。
继承需要符合的关系是:is-a关系,表示一个更特殊的类与一个更一般的类之间的关系
上图中,哺乳动物继承了动物,这说明动物的特性哺乳动物都有。
代码示例:
public class ExtendsTest{
public static void main(String[] args) {
Student s = new Student("Vicky",165,"Java");
s.rest();
s.study();
}
}
class Person {
String name;
int height;
public void rest(){
System.out.println("要好好加油");
}
}
class Student extends Person {
String major;
public void study(){
System.out.println("进入阿里");
}
public Student(String name,int height,String major) {
//天然拥有父类的属性
this.name = name;
this.height = height;
this.major = major;
}
}
- 封装
需要让用户知道的暴露出来,不需要让用户知道的全部隐藏起来。封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装的优点:1. 提高代码的安全性 2.提高代码的复用性 3.“高内聚”:封装细节,便于修改内部代码,提高可维护性 4.“低耦合”:简化外部调用,便于使用者使用,便于扩展和协作
Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。Java中4种“访问控制符”:private,default,protected,public。
4种访问控制符的访问权限范围
- 多态
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
多态的要点:
1.多态是方法的多态,不是属性的多态
2.多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法。
代码示例
class Animal {
public void shout() {
System.out.println("叫了一声!");
}
}
class Dog extends Animal {
public void shout() {
System.out.println("旺旺旺!");
}
public void seeDoor() {
System.out.println("看门中....");
}
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵喵喵!");
}
}
public class TestPolym {
public static void main(String[] args) {
Animal a1 = new Cat(); // 向上可以自动转型
animalCry(a1);
Animal a2 = new Dog();
animalCry(a2);
Dog dog = (Dog)a2;//向下需要强制类型转换
dog.seeDoor();
}
// 有了多态,只需要让增加的这个类继承Animal类就可以了。
static void animalCry(Animal a) {
a.shout();
}