黑马程序员_面向对象简述及三大特征

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

一 面向对象概述

面向对象是由早期的面向过程思想慢慢演变过来的一种思想

 

面向对象与面向过程的区别:

                面向过程:强调的是功能行为(单一的,只为完成一个动作而存在)

                面向对象:将功能封装进对象,强调具备了功能的对象(想做什么让对象帮你完成)

 

引用经典例子:如何把大象放进冰箱里?

 

        面向过程的思想里是这么解决的:

                打开冰箱

                存储大象进冰箱

                关闭冰箱

 

        面向对象的思想里是这么解决的:

                封装一个对象冰箱

                冰箱有打开功能

                冰箱有装入大象的功能

                冰箱有关闭的功能

 

由上面的例子看出:

                        面向对象的特点:

                        可以使复杂问题简单化,只需要操作对象

                        从一个执行者变成指挥者,指挥对象来完成 

 

二 面向对象的三个基本特征:封装、继承、多态

 

封装

 

1 封装:

        是指隐藏对象的属性和实现细节,仅对外提供公共访问方式 

2 封装的意义:

            将变化隔离

            便于使用

            提高重用性

            提高安全性

 

3 封装的原则:

           将不需要对外提供的内容都隐藏起来

           把属性都隐藏,提供公共访问方法对其访问

 

引用个例子形象的说明一下:

(封装)机箱,外行人不知道里面是怎么运行的,

(便于使用)但是外行人照样根据外部暴露的插槽很容易就知道怎么用,

(隔离变化)过段时间里面被改变了(比如:升级),外行人还是照样用,才不管里面怎么闹,外面的插槽知道怎么用就行了

(提高重用性)外行人可以重复使用机箱

(提高安全性)外部的简单操作足够用,外壳保护里面不被干涉,避免外行人胡乱操作造成不良后果

 

4 private修饰

 

编写一个Person类并使用private修饰变量,使变量成为私有的,这是封装的基本表现形式

class Person
{
	//定义私有变量
	private int age;
	//无参构造函数
       	Person(){}
	//变量被封装了的同时Person类对外提供一个公开的访问变量的方法
       	public void setAge(int age)
	{
       		//可在此范围内添加限制条件,限制传入数据的可靠性,这也是封装的意义,提高安全性,也就是健壮性
       		this.age = age;
	}
	//公开的对外访问方法,与setAge是一对的,一个负责设置值,一个取值
	public int getAge()
	{
       		return this.age;
	}

	public void speak()
	{
       		System.out.println("age = "+age);
	}
}
class Demo
{
       	public static void main(String[] args)
	{
       		Person p = new Person();
		//调用对外公开的访问方法访问私有变量
		p.setAge();
		p.speak();
	}
}

 

继承

 

继承:

        面向对象思想就是将有共同特性的功能抽象成一个概念,也就是对象

        而继承则是更进一步,众多的子类,继承于有共同特性的父类,提高代码的重用性

        继承的好处顾名思义就是子类拥有了父类的所有可被继承的特性

 

举例:学生和工人都属于人

 

class Person

{

       String name;

       int age;

}

class Student extends Person

{

       int score;

}

class Worker extends Person

{

       int money;

}

class Demo

{

         public static void main(String[] args)

         {

                  Student s = new Student();

                  s.name = "Peter";

                  s.score = 90;

          }

}

由上面的例子可看出:

                            父类有所有子类的共性

                            子类有属于自己的特性

注意事项:

                只能单继承,一个之类只能有一个父类,一个父类可以有多个子类

 

子父类中函数的特点覆盖

                子类的方法与父类的方法同名,则子类方法覆盖父类方法,保留父类的方法定义(重写)

 

覆盖规则

                子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败

                静态只能覆盖静态

 

覆盖是局限于重写的,如果容易和重载混淆的话看看下面的一段关于重写和重载的概括:

重载和重写的区别:

                          重载:只看同名函数的参数类表。也就是说方法名相同,参数个数、顺序、类型不同

                          重写:子父类方法要一模一样。也就是说方法名一样,参数个数、顺序、类型也要一样

 

子类父类中构造函数的特点-子类实例化过程

子类实例化时在初始化构造函数,根据函数里的super()调用父类构造函数,确保父类构造函数里对父类内部成员的更改被执行到

比如:子类用super(4)来调用父类的构造函数对变量进行更改

注意事项super语句一定定义在子类构造函数的第一行  

 

多态

 

多态:

        可以理解为事物存在的多种体现形态

        多态不只有体现在对象上,也体现在其他方面比如:方法的重载和重写

 

多态的体现:

         父类的引用指向自己的子类对象,比如:Person p = new Student();

         父类的引用也可以接收自己的子类对象,比如:public void show(Person p)传入的是Student类的对象

 

多态的前提:

必须是类与类之间有关系,要么继承,要么实现

通常还有一个前提:存在覆盖

 

多态的好处:

多态的出现大大提高了程序的扩展性

 

多态的弊端:

提高了扩展性,但是只能使用父类的引用访问父类中的成员

也就是说子类中有但是父类里面没有的成员不能通过父类引用访问

 

多态的应用:

 

abstract class Animal
{
	//抽象类里面的抽象方法
	public void eat();

}
//猫类继承动物类
class Cat extends Animal

{
	//覆盖了eat方法
	public void eat()

	{

       		System.out.println("吃鱼");

	}

	public void catchMouse()

	{

       		System.out.println("抓老鼠");

	}

}
//狗类继承了动物类
class Dog extends Animal

{
	//也覆盖了eat方法
	public void eat()

	{

       		System.out.println("啃骨头");

	}

}

class Pig extends Animal

{

	public void eat()

	{

       		System.out.println("吃饲料");

	}

}

class Demo

{

	public static void main(String[] args)

	{
		//父类的引用指向子类对象
       		Animal c = new Car();
		c.eat();//但是只能局限与父类的方法
	}

}

多态就像角色扮演一样

父亲是专演农民的演员,有天生病了,儿子代替客串一下,

因为角色原因儿子只能根据其进行发挥,而不能超出范围 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

你可能感兴趣的:(java)