面向对象编程(Object Oriented Programming,故常称OOP)并不是Java独有,而是一种编程的思想,Java、C++、Python均有对其实现。其本质是以创建模型体现出来的抽象思惟过程和面向对象的方法。模型是用来反映现实世界中事物特征的,任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更广泛、更集中、更深入地描述客体的特征。经过创建模型而达到的抽象是人们对客体认识的深化。java
优势:易于维护与扩展,代码复用性高。因为面向对象有封装、继承、多态性的特性,能够设计出低耦合的系统,使系统更加灵活多变。
缺点:CPU开销大、占据资源多编程
封装:隐藏对象的属性和实现细节,仅保留一些对外接口;
继承:子类能够继承父类的属性和方法;
多态:同一个行为具备多个不一样表现形式或形态的能力。ide
使用访问权限修饰符来实现对属性和方法的控制,包括private:仅限本类能够访问;default(默认权限):仅限本包能够访问;protected:仅限包内和继承的子类能够访问;public:都可访问。
咱们在定义一个对象类时,一般对属性进行隐藏,提供公共的set、get方法进行访问。学习
/** * @author RuiMing Lin * @date 2020-03-05 16:01 */ public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
继承可使子类得到父类的全部非私有属性和方法,减小了代码的复用。继承可使对象层次化,类型比较明确。大数据
/** * @author RuiMing Lin * @date 2020-03-05 18:18 */ public class Demo { public static void main(String[] args) { Son s = new Son("小明",23); s.eat(); //从父类继承的方法 s.sleep(); //从新父类的方法 s.study(); //子类本身定义的方法 } } class Father{ String name; int age; public Father(String name, int age) { this.name = name; this.age = age; } public void eat(){ System.out.println("吃饭"); } public void sleep(){ System.out.println("父亲睡觉"); } } class Son extends Father{ public Son(String name, int age) { super(name, age); } @Override public void sleep(){ System.out.println("儿子睡觉"); } public void study(){ System.out.println("儿子学习"); } }
public abstract class Animal { public abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } } public class Test { public static void main(String[] args) { // 多态形式,建立对象 Cat c = new Cat(); Dog d = new Dog(); // 调用showCatEat showCatEat(c); // 调用showDogEat showDogEat(d); showAnimalEat(c); showAnimalEat(d); } public static void showCatEat (Cat c){ c.eat(); } public static void showDogEat (Dog d){ d.eat(); } public static void showAnimalEat (Animal a){ a.eat(); } }
因为多态特性的支持,showAnimalEat方法的Animal类型,是Cat和Dog的父类类型,父类类型接收子类对象,能够把Cat对象和Dog对象传递给方法。当eat方法执行时,多态规定,执行的是子类重写的方法,那么效果天然与showCatEat、showDogEat方法一致, 因此showAnimalEat彻底能够替代以上两方法。不只仅是替代,在扩展性方面,不管以后再多的子类出现,咱们都不须要编写showXxxEat方法了,直接使用 showAnimalEat均可以完成。 因此,多态的好处,体如今可使程序编写的更简单,并有良好的扩展。ui
编译期如果父类(父接口)拥有该方法或类,则使用的IDE不会报错;运行期则看具体的类型,如果该类该方法或类,则使用的IDE不会报错。this
- 成员变量:编译期看左边,运行期看左边;
- 静态方法:编译期看左边,运行期看左边;
- 非静态方法:编译期看左边,运行期看右边。
面向对象编程思想不一样于面向过程编程,它的使用更加的严格与规范。Java的面向对象编程更是有许多规范,须要对Java学习的更加深刻才会对它更好的理解。设计
有错误的地方敬请指出,欢迎你们评论区或者私信交流!每日持续更新Java、Python、大数据技术,请你们多多关注!code