面向对象的一些基本概念
软件工程第六版
下面都是面向对象的精华,好好吸收,完全可以掌握
-
拿一个圆做例子,有半径、周长、颜色、位置,我们现在有3个不同的圆,每个圆就是一个不同的的对象。但是他们都有相同的数据(半径、周长…)和相同的操作(显示自己、缩小半径等),因此他们是同一类事物,用Circle类来定义,而3个不同的圆可以声明为circle1,circle2,circle3,是具体的对象。
-
实例就是由某个特定的类所描述的一个具体的对象,类是抽象的,并不是真是存在的,谁也没有见过抽象的圆。换句话来说,类就是建立对象时使用的**”样板“,按照这个样本所建立的一个个具体的对象,就是类的实际例子,成为实例**。
-
消息是某个操作的规格说明,比如MyCircle.show(GREEN),MyCircle就是对象的名字,show就是消息名,GREEN就是消息的变元。
-
方法就是对象所执行的操作,响应消息的方法。
-
属性就是类中所定义的数据
-
封装就是包装一个事务,使外界不知道该事物的具体内容。
-
继承就是能够直接获得已有的性质和特征,不必重复定义他们,子类自动地共享基类中定义的数据和方法的机制。
举个例子:现在有两个类,A类和B类,让B类继承A类,B类除了自己的特性(数据和操作)之外,还从父类A继承特性。当创建A类a1时,a1以A类为样板创建实例变量(在内存中分配所需要的空间),但它并不从A类中福之所一定的方法。
当创建 B类的实例b1时,b1既要以B类为样版创建实例变量,又要以A类为样版创建实例变量,b1所能执行的操作既有B类中定义的方法,又有A类中定义的方法,这就是继承。如果B类中又定义了和A类中同名的数据或操作,则b1仅使用B类中定义的这个数据或操作,除非采用特别措施,否则A类中与之同名的数据或操作在b1就不能使用。
-
多态本意是”有许多形态“,希腊语。指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。也就是说,在类等级的不同层次中可以共享一个行为的名字,然而不同的层次中的每个类却各自按自己的需要来实现这个行为。当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。
举个例子:A a=new B(); a.show(); 这就是多态 //show必须是继承的方法。
多态使用的细节:
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
【多态的前提:必须存在继承或者实现关系。 】
-
重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。注意和重写的区别。
拿上面的思想举例子演示
Animal.java
package cn.extendsdemo;
public class Animal {
private int age;
private String name;
private String fiece;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFiece() {
return fiece;
}
public void setFiece(String fiece) {
this.fiece = fiece;
}
public void run(){
System.out.println("我会跑");
}
public void eat(){
System.out.println("我会吃");
}
@Override
public String toString() {
return "Animal{" +
"age=" + age +
", name='" + name + '\'' +
", fiece='" + fiece + '\'' +
'}';
}
public static void main(String[] args) {
Animal a=new Dog();//多态
a.eat();
}
}
Cat.java
public class Cat extends Animal{
static void main(String[] args) {
Cat tom=new Cat();//tom 是一个对象,是具体的对象,而Cat是个抽象的概念,所以叫类。设计要求:类中的属性是所有对象所共享的。
//继承父类的方法
tom.eat();
tom.run();
//继承了父类的属性
tom.setAge(21);
tom.setFiece("温柔");
tom.setName("Tom");
System.out.println(tom);
}
}
Dog.java
package cn.extendsdemo;
public class Dog extends Animal {
public void eat(){//重写
System.out.println("我只吃肉和骨头");
}
public static void main(String[] args) {
Dog dog=new Dog();
dog.eat();//当子类和父类方法冲突时,优先执行子类,父类功能不能用。
dog.run();
}
}