面向对象对于我们来说是抽象的,在这里我说说自己对面向对象的一些基础见解,后期会持续更新,希望给一些刚学习编程的同学一些帮助
• 继承 inheritance
• 子类 父类
• 子类可以从父类继承属性和方法
• 子类可以提供自己单独的属性和方法
• 封装/隐藏encapsulation
• 对外隐藏某些属性和方法
• 对外公开某些属性和方法
• 多态 polymorphism
• 为了适应需求的多种变化,使代码变得更加通用!
面向过程只有封装性(功能的封装,而没有数据的封装),没有继承和多态
隐藏/封装(encapsulation)
• 为什么需要封装?封装的作用和含义? • 我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰 碰显像管吗? • 我要开车,…. • 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩 展性、可维护性。 • 我们程序设计要追求“高内聚,低耦合”。 • 高内聚 :就是类的内部数据操作细节自己完成,不允许外部干涉; • 低耦合 :仅暴露少量的方法给外部使用。
’
使用访问控制符,实现封装
• 成员(成员变量或成员方法)访问权限共有四种:
• public 公共的 • 可以被项目中所有的类访问。(项目可见性)
• protected 受保护的
• 可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问
• default/friendly 默认的/友好的(包可见性)
• 被这个类本身访问;被同一个包中的类访问。
• private 私有的 • 只能被这个类本身访问。(类可见性)
• 类的访问权限只有两种
• public 公共的 • 可被同一项目中所有的类访问。 (必须与文件名同名)
• default/friendly 默认的/友好的
• 可被同一个包中的类访问。
• 封装要点:
• 类的属性的处理:
• 一般使用private. (除非本属性确定会让子类继承)
• 提供相应的get/set方法来访问相关属性. 这些方法通常是public,从而提供对属性的读取操作。 (注意:boolean变量的get方法是用:is开头!)
• 一些只用于本类的辅助性方法可以用private,
• 希望其他类调用的方法用public
继承
• 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
• 提高代码的复用性!
• extands的意思是“扩展”。子类是父类的扩展
• 不同的叫法:超类、父类、基类、子类、派生类
public class TestExtends { public static void main(String[] args) {
Mammal m1 = new Mammal();
m1.puru(); m1.eat();
}
}
class Animal {
String eyes="眼睛";
String name="无名";
public void eat(){
System.out.println("动物吃东西!");
}
}
class Mammal extends Animal {
//哺乳
public void puru(){
System.out.println("小动物吃奶!");
}
}
• 通过继承可以简化类的定义,实现代码的重用
• 子类继承父类的成员变量和成员方法,但不继承父类的构造方法
• java中只有单继承 ,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统 难于维护。就像我们现实中,如果你有多个父母亲,那是一个多么混乱的世界啊。多继承,就 是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。
• java中的多继承,可以通过接口来实现
• 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
方法的重写(override)
• 在子类中可以根据需要对从基类中继承来的方法进行重写。
• 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
• 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
重写(override)举例代码
public class TestOverride {
public static void main(String[] args) {
Animal animal = new Animal();
animal.shout();
Dog dog = new Dog(); dog.shout();
}
}
class Animal{ void shout(){
System.out.println("发出声音!");
}
}
class Dog extends Animal {
void shout(){
System.out.println("旺旺旺!");
}
}
继承深化
• 父类方法的重写:
• “==”:方法名、形参列表相同。
• “≤≤”:返回值类型和异常类型,子类小于等于父类。
• “≥”:访问权限,子类大于等于父类
• 构造方法调用顺序:
• 根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。
• 先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
多态 polymorphism
• 多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有 在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展 性。
• java中如何实现多态?使用多态的好处?
• 引用变量的两种类型:
• 编译时类型(模糊一点,一般是一个父类)
• 由声明时的类型决定。
• 运行时类型(运行时,具体是哪个子类就是哪个子类)
• 由实际对应的对象类型决定。
• 多态的存在要有3个必要条件:
• 要有继承,要有方法重写,父类引用指向子类对象