什么是面向对象?
Java中只有值传递,引用类型传递的是地址值。
内存:
栈:先进后出。
弹栈:取数据的方式。
压栈:存数据的方式。
举例:
手枪的弹夹。
面向对象:
面向对象和面向过程都是一种思想。
面向对象是基于面向过程的。
面向过程:以函数为基础,完成各种操作。强调的是过程。
面向对象:以对象为基础,完成各种操作。强调的是对象。
总结:万物皆对象。
思想特点:
1、更符合人们的思考习惯。
2、把复杂的事情变得简单化。
3、把程序员从执行者变成了指挥者。
举例:
买电脑:
面向过程;自己做完所有的事儿。强调的是买这个过程。
面向对象:找认识的人(让他帮我买)。强调的是对象,结果。
面向对象的三大特征:
封装,继承,多态。
什么是面向对象?
它是一种编程思想,是基于面向过程的。面向过程强调的是过程,而面向对象强调的是对象。
他的特点是1,2,3。比如说:
举例:
其实,万物皆对象。
以后向使用某个功能或者执行某个动作的话,怎么做?
找对象,让它来做。
怎么找?找JDK要。
如果JDK没有,我们就自己造一个,自己用完了,还可以给别人用。
把大象装进冰箱:
冰箱IceBox:
开门open()
关门close()
大象Elephant:
进去in()
测试类:
main()
{
冰箱对象.open();
大象对象.in();
冰箱对象.close();
}
伪代码:
class IceBox
{
public void open()
{
System.out.println("打开冰箱门");
}
public void close()
{
System.out.println("关闭冰箱门");
}
}
class Elephant
{
public void in()
{
System.out.println("大象Come in!");
}
}
class Test
{
public static void main(String[] args)
{
冰箱对象.open();
大象对象.in();
冰箱对象.close();
}
}
怎么样才能让我们的操作更符合面向对象的思想呢?
1、分析该系统中有那些对象。
A:名词提取法。
B:UML统一建模语言,闫闳
2、每个对象的功能。
3、明确各个对象之间的关系。
类与对象的关系概述:
理解性:
开发:就是不断的创建对象,使用对象,指挥对象做事情。
设计:维护和管理各个对象之间的关系。
学Java就是为了把现实世界的事物通过编程语言给体现出来。
Java描述事物无非就是描述事物的:属性和行为。
掌握:
属性:外在特征。
行为:能够做什么。
Java语言最基本的单位是:类。
计算机最基本的存储单位是:字节。
类:属性和行为的集合体,一个抽象的概念。
对象:类的具体实现,体现。
成员变量;属性。
定义在类中,方法外的变量。
成员方法:行为。
就是咱们学的函数,先把static去掉。
写一个学生类:
1、分析学生事物
属性:姓名,年龄,性别
行为:学习,吃饭,睡觉
2、把分析后的学生事物转成Java中的类:
学生类;
成员变量:
姓名:name
年龄;age
性别:sex/gender
成员方法:
学习:study()
吃饭;eat()
睡觉: sleep()
注意:
从今天开始,咱们可以在一个文本文件中写多个类了。(开发中不这样写,一个文件只写一个类)
文件名必须和带main函数的类名一致
如果使用学生类中的内容?
1、想使用学生类中的内容,必须明确通过那个学生来调用。
2、怎么明确一个的具体对象?
通过new关键字。
格式:
类名 对象名 = new 类名();
3、怎么使用类中的成员(成员变量,成员方法)。
成员变量: 对象名.成员变量;
成员方法: 对象名.成员方法();
怎么给成员变量赋值?
对象名.成员变量 = 值;
什么时候定义成员变量?
只有能够用于描述一个类的属性的东西,才可以定义为成员变量。
注意:
使用变量的时候,遵循一个“就近原则”。
会现在局部范围内找,有就使用,没有就去成员位置找,有就使用,没有就报错。(先这样记,不严谨)
成员变量和局部变量有什么区别?
A:定义位置不同。
成员变量:类中,方法外。
局部变量:方法中,或者方法的形参上。
B:初始化值不同:
成员变量:有默认初始化值。
局部变量:没有默认初始化值,必须先定义,再赋值,然后才能使用。
C:存储位置不同(生命周期不同):
成员变量:堆。随着对象的创建而存在,随着对象的消失而消失。
局部变量:栈。随着方法的调用而存在,随着方法调用完毕而消失。
匿名对象:
概述:没有名字的对象。
应用场景:
A:当对 对象(成员)方法仅调用一次的时候。
B:匿名对象可以作为实际参数进行传递。
一 封装:★★★★★
概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离;便于使用;提高重用性;安全性。
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
二 继承 ★★★★★
好处:
1:提高了代码的复用性。
2:让类与类之间产生了关系,提供了另一个特征多态的前提。
注意:
子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。
如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。
final特点:
1:这个关键字是一个修饰符,可以修饰类,方法,变量。
2:被final修饰的类是一个最终类,不可以被继承。
3:被final修饰的方法是一个最终方法,不可以被覆盖。
4:被final修饰的变量是一个常量,只能赋值一次。
抽象类的特点:
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
5: 抽象类只能单继承。
抽象类的细节:
1:抽象类中是否有构造函数?有,用于给子类对象进行初始化。
2:抽象类中是否可以定义非抽象方法?
可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。
3:抽象关键字abstract和哪些不可以共存?final , private , static
4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
接 口:★★★★★
抽象类和接口的区别:(问的比较多,概念性的问题)
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。
三 多态(在后期开发中常用)
多 态★★★★★(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现。
体现:父类引用或者接口的引用指向了自己的子类对象。//Animal a = new Cat();
多态的好处:提高了程序的扩展性。
多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
多态的前提:
1:必须要有关系,比如继承、或者实现。
2:通常会有覆盖操作。
匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象。想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。
匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。
匿名内部类的使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。
其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。