首页 > 代码库 > 面向对象之理解
面向对象之理解
面向对象之理解
1.简单举例:
我们可以看到一个超市有收银员,采购员,配货员等.
收银员之间:有不同的姓名,年龄,工号等,但有相同的行为方法,即扫描货物,收钱,找钱等.
采购员之间:有不同的姓名,年龄,工号等,但有相同的行为方法,即统计缺货数量,进行采购行为等.
配货员之间:有不同的姓名,年龄,工号等,但有相同的行为方法,即查明缺货位置,进行配货行为等.
大家一起合作使得超市运作起来
面向对象其实就如同面向一个个超市的具体员工
2.类和对象的概念
Java中最基本的单位是类,类是对象的抽象.在java中代码都是我们用键盘敲的,那么写在我们代码里的,也就是我们定义,创建的,因为他们是你码的.
对象就如同超市具体工作的每个员工,
类就如同一个群体,如收银员这个群体,我们叫他收银员类,
我们定义这类收银员都应该有姓名,年龄,工号等属性,我们在定义时称其为成员变量.
我们收银员定义这类收银员都应该做某些规定的行为方法,我们在定义时称其为成员方法.
因此我们在定义类的时候,可以包括成员变量,成员方法.(可以定义什么都没有得类,但是这很浪费感情).
a:类:是一组相关的属性(成员变量)和行为(成员方法)的集合
b:对象:是该类事物的具体体现
3.类和对象的使用
(1)类的成员
定义类其实就是定义类的成员(成员变量和成员方法)
a:成员变量 在类中,方法外。
b:成员方法
(2)如何使用对象
创建对象的格式:类名 对象名 = new 类名();对象名其实就是合法表示符,一个单词所有小写,多个从第二个单词首字母大写
a:调用成员变量:对象名.变量名
b:调用成员方法:对象名.方法名(...)
c:匿名对象应用场景:
a:调用方法,适用调用一次的时候。
new 类名(...).成员变量
new 类名(...).成员方法
b:匿名对象可以作为实际参数传递(地址值)
注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。(对匿名对象匿名内部类的理解后面讲)
4.数据初始化--构造方法
(1)构造方法
给对象的数据(属性)进行初始化
(2)构造方法注意事项
a:如果我们没有给出构造方法,系统将(默认)自动提供一个无参构造方法。
b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
(3)有参无参构造
无参构造Public 类名() {}
有参构造public Student(String name,int age){
this.name = name;
This.age = age;
}
备注:在创建对象时要初始化值,而构造方法是用来给对象的数据(属性)进行初始化的,因此在创建对象时要调用构造方法.构造方法也是方法,里面也可有成员变量,成员方法.
类名 对象名=new 类名()是通过空参构造初始化值创建对象,
类名 对象名=new 类名(参数)是通过空参构造初始化值创建对象,
5.面向对象特征
封装(encapsulation) 继承(inheritance) 多态(polymorphism)
(1)封装
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。(封装是相对的).
a.封装好处
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性。
b.封装原则
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
c.常用private关键字封装
1) 特点
是一个权限修饰符
可以修饰成员变量和成员方法
被其修饰的成员只能在本类中被访问
2)private的应用
把成员变量用private修饰
提供对应的getXxx()和setXxx()方法(提供公共的访问方式)
(2)继承
让类与类之间产生关系,子父类关系.
1)继承的好处和弊端
继承的好处
提高了代码的复用性
提高了代码的维护性(父类增加属性,子类也有了属性)
让类与类之间产生了关系,是多态的前提
继承的弊端
类的耦合性增强了.子父类联系紧密,父类变化,子类变化
2)Java中类的继承特点
a.Java只支持单继承,不支持多继承。
b.Java支持多层继承(继承体系)
3)继承的注意事项
a:子类只能继承父类所有非私有的成员(继承后直接调用)
b:子类不能继承父类的构造方法,但是通过super(马上讲)关键字去访问父类构造方法。自己是自己的构造方法,给自己初始化值的.
c:不要为了部分功能而去继承
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
子类对象调用方法的时候,先找子类本身,再找父类。
4)继承中成员变量的关系
子父类出现不同名的变量可以输出;
子父类出现同名变量时,就近原则,
5)继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法.每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。(一般是第一条语句).
因为子类会继承父类中的数据,可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。
class Son extends Father {
public Son() {
//隐藏super();
System.out.println("Son空参构造");
}
public Son(String name,int age) {
//隐藏super();
System.out.println("Son有参构造");
}
(3)多态
在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态
1)多态前提
a:要有继承关系。
b:要有方法重写。
c:要有父类引用指向子类对象。
2)多态中的成员访问特点之成员变量
a.成员变量:编译看左边(父类),运行看左边(父类)。
b.成员方法:编译看左边(父类),运行看右边(子类)。动态绑定,如果父类中没有该方法,编译时不通过的
c.静态方:编译看左边(父类),运行看左边(父类)。
3)多态中向上转型和向下转型
a.向上转型:Person p = new SuperMan();(父类引用指向子类对象)(SuperMan()提升为了Person类型),
b.向下转型:SuperMan sm = (SuperMan)p;向下转型(如同强制类型转换),一定要先向上转型才有向下转型
4)多态的好处和弊端
a.多态的好处
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证)
可以当作形式参数,可以接收任意子类对象,调用成员方法时,运行看子类对象的方法
b.多态的弊端:不能使用子类的特有属性和行为。
小结:
定义工作的群体---类,类的成员有成员变量,成员方法.
通过类创建对象:Cat c = new Cat();其中对象的实体存在堆里,对象名c存储了实体所存储的地址值,对象名c是属于类名类型即:Cat类型.而c是由new Cat()赋值过来的,则new Cat()存储的是地址值,并创建了对象实体,其实这个就是匿名对象.
进行调用即是:c.name = "加菲";即是通过地址值找到name,然后给name赋值.相当于 地址值.name = "加菲",地址值又可以写成new Cat(),即 new Cat().name = "加菲";
构造方法是用来对属性进行初始化的,:Cat c = new Cat();则是通过空参构造创建对象的,Cat c = new Cat("加菲",3);是通过有参构造创建对象的.
在创建对象时要初始化值,因此在类,系统默认有空参构造,建议空参有参都写上,在继承中,子类构造方法第一个语句是super(),你在子类中不写构造方法,也可以通过父类构造方法进行初始化.
下面有点套路:私有化成员变量--构造方法--成员方法(包括对私有化的公共访问方式).
整个面向对象有封装-继承-多态三个特点.这些特点代表可以这么用.
Father f = new Son();
f是Father类型的值,父类型的引用(地址值),指向子类对象.
public void method(Father f){....}
在调用参数时用对象时method(new Son()),其实是将这个匿名子类对象的地址值赋值给Father类型的f,就是父类引用指向子类对象.
面向对象之理解