---------------------- 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