java面向对象详解
面向对象,好多的初学者感到这个知识点特别的不容易理解,今天我们来聊聊面向对象的具体思想,以及构成的面向对象的三大主要内容,封装,继承,多态,是为什么要来使用的。
来我们先来谈谈,在面向对象之前,面向过程是怎么样的。
面向过程:
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
来,我们再来看看面向对象:
面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
简单来说就是不用过度关系方法的具体实现,而是来注重方法是否可以调用。
看官再接着来看:
封装
封装,将代码和数据捆绑在一起,隐藏类的属性,暴露出一个方法提供给外界访问
package com.gsy.demo.entity;
public class User {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "BeansDemo{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
继承
继承,子类继承父类,也可以 派生类,超类,使用的关键字是 extends
格式:
public class 子类 extends 父类{
}
子类继承了父类后:子类在堆区的空间指向了父类,可以根据权限来使用父类的属性和方法。
加载过程:
package com.gsy.demo.entity;
public class User extends People{
String name;
String sex;
int age;
static {
System.out.println(name);
}
public User(String name, String sex, int age) {
// 这里会默认写一个super(),是为了加载这个类的时候,先去加载父类的时候先初始化父类。
this.name = name;
this.sex = sex;
this.age = age;
}
}
class People{
String colour;
static {
System.out.println(colour);
}
// 初始化父类,导致父类被加载,又导入静态代码块被执行。
}
程序首先加载类,然后再对类进行初始化。
加载类的顺序为:先加载父类,父类加载完毕后再加载子类。
初始化的顺序为:先初始化父类,父类初始化完毕后再初始化子类。
最后得出类加载顺序为:先按照声明顺序初始化基类静态变量和静态代码块,接着按照声明顺序初始化子类静态变量和静态代码块,而后按照声明顺序初始化基类普通变量和普通代码块,然后执行父类构造函数,接着按照声明顺序初始化子类普通变量和普通代码块,最后执行子类构造函数。
多态
首先,多态从字面上的意思是指,一种事物的多种状态。然后多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。从程序设计的角度而言,多态可以这样来实现(以java语言为例):
package com.gsy.demo.test;
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}