一、面向对象
(一)、初步了解:
1、两者都是程序设计的一种风格(思想)。
2、除了面向对象,还有面向过程、指令式编程和函数式编程 。但在所有编程范式中,我们接触最多的还是面向过程和面向对象两种。
3、面向过程思想最先出现,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式。
(二)、概念介绍:
1、面向过程:(procedure -Oriented Programming),简称POP
(1)、是以函数(一个一个功能)为结构,进行代码组织
(2)、解决问题时关注的焦点是过程,分析解决问题所需步骤一步一步解决
(4)、因此适合解决简单问题 ,相对于面向对象相语言,扩展能力差、后期维护难度较大。
(3)、代表语言:c语言
2、面向对象:( Object Oriented Programming),简称OOP
(1)、以类为组织单位。每种事物都具备自己的属性和行为(功能 )
(2)、解决问题时关注的焦点是类:分析各个类的属性和功能,抽取所需属性和功能,补充新的属性和功能形成新的类解决问题
(3)、因此可以解决复杂问题,代码扩展性强、可维护性高
(4)、代表语言:C++、C#、Java、Python、Ruby和PHP等
(三)、举例对比:
例题:实现把大象装进冰箱
1、用面向过程思想:
(1)、分析过程:打开冰箱==>把大象装进冰箱==>关上冰箱
(2)、逐步实现过程
2、用面向对象思想:
(1)、分析类:①:人 ②:大象 ③:冰箱
(2)、分析每个类的属性和功能,解决问题
(四)、补充说明
1、面向过程和面向对象虽然是两种不同的编程范式,但彼此并不相对独立,他们相辅相成的
2、面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
二、类和对象(面向对象的核心概念)
(一)、基本理解:
1、类:具有相同特征的事物的抽象描述(定义/概念/模板)
2、对象:该类事物具体存在的一个个个体(万事万物皆为对象)
3、举例:
类 ==> 抽象概念的人
对象 ==> 实实在在的某个人
4、类的结构
(1)、变量:事物属性的描述(名词)
(2)、方法:事物的行为,即可以做的事情(动词)
(3)、构造方法:初始化对象
(4)、块:一段没有名称的代码块
(5)、内部类: 即在类体中声明的类(嵌套)
(二)、定义类
1、总结定义类:
类的声明格式:
[访问权限修饰符] [修饰符] class 类名{
}
2、发现类的共有属性(成员变量)
举例:
public class Car{
//成员变量定义
String name; //名称
String color; // 颜色
float price;//价格
}
3、发现类的共有行为(成员方法)
方法声明格式:
[访问权限修饰符] [修饰符] void start( ){
System.out.println("汽车启动");
[return 返回值;]
}
三、变量
(一)、分类
1、按类型分:
基本数据类型
引用数据类型
2、按位置分:
成员变量(在类中定义)
(1)、成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
(2)、java中的变量在使用之前都想必须初始化,但对于成员变量,系统会默认进行初始化(String初始化为null)。
(3)、在成员变量可以在成员方法、构造方法/代码块中使用
(4)、成员变量的作用范围为整个类体
局部变量(在方法中定义)
(1)、局部变量不会初始化
(2)、方法参数也是局部变量
四、构造方法
1、每个类都有构造方法,如果没有显式地为类定义构造方法,Java将会为该类提供一个默认构造方法 (用来为新创建的对象中的成员变量进行初始化)
2、默认提供的构造方法 方法名 与 类名 相同,且没有返回值,不需要使用void修饰
3、只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效 (此时需要自己对成员变量进行初始化)(可以使用方法的重载)
4、一个类可以有多个构造方法
五、方法的重载
1、在一个类中,有多个方法名相同但参数个数不同的方法
2、为使系统区分这些方法,这些方法的参数必须不同(类型、个数、顺序)
(Java属于强类型语言)
3、方法重载跟方法的返回值类型没有任何关系
六、对象与引用
1、Java 语言中除基本类型之外的变量类型都称之为引用类型
2、Java中的对象是通过引用对其操作
3、Java中进行方法调用中传递参数时,参数传递有两种
(1)、值传递:(形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应 的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同 的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
(2)、引用传递:引用传递:(形参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参 数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的 操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法 执行中形式参数的改变将会影响实际参数
七、关键字
(一)、this关键字
1、引用成员变量:
this关键字表示当前正在执行的对象
在编程时,为了区分成员变量和局部变量,在编码时,可以使用this关键进行指示,使用this调用的是成员变量或者成员方法
2、引用构造方法:
(二)、static(静态)关键字
1、修饰成员变量、成员方法、代码块、内部类
2、静态变量
eg:
public class Chinese {
String name;
static String country="中国";
}
(1)、静态变量与类一样,只在方法区创建一次,即只有一份
(2)、当所有类的某个属性值相同,就可以将这个属性值定义为静态变量,以便于更加合理的使用内存。
(3)、当类被加载时,静态成员就会加载(因此非静态成员不能在静态方法中使用)
(4)、静态的执行可以被类、对象访问,但非静态的执行只能通过对象访问
(5)、可以通过 . 类名 修改或调用静态变量
或 . 引用对象名
(6)、但因静态成员只在类中有一份,所以建议 直接使用类名进行访
(7)、不能用this
(8)、静态变量在加载时,由系统自动初始化赋值
2、静态方法
(1)、加载顺序:静态方法随类的加载而加载,先于对象存在,非静态的方法创建对象后才加载
(2)、静态方法在本类的任意方法、代码块、构造器中都可以直接被调用
(3)、静态方法在其他类中可以通过类名直接访问(也可以通过对象.静态方法的方式调用但是更推荐使用类名.静态方法的方式)
(4)、静态方法不能使用非静态成员
(5)、非静态成员方法,可以使用静态成员变量,因为静态变量先加载
(6)、static方法内部不能有this,也不能有super
3、在方法中不使用非静态的成员变量时,可以将方法设计为非静态方法,方便访问,节省内存
八、代码块:(定义在类中,类似于一个没有名字的方法,分为实例代码块和静态代码块 )
1、补充:类中可以定义:
成员变量 :非静态(属于对象):每个对象都有一份
静态(属于类):和类一样只有一份
成员方法:非静态:可以使用静态和非静态的成员变量
静态:只能使用静态的成员变量
构造方法:用来在创建对象后,为对象成员进行初始化
代码块:定义在类中,类似于一个没有名字的方法,分为实例代码块和静态代码块
2、因为代码块没有名字,只能在满足条件时由系统调用
3、实例代码块:在创建对象时,被自动调用执行(实例代码块先于构造方法)
4、静态代码块:在类被加载时,被自动调用执行(和类一样只会加载一次)
5、类什么时候被加载
()、通过类名访问类中的静态成员时
()、在一个类中使用main方法
()、创建对象也会加载类
6、如果由多个实例代码块或多个静态代码块,他们会按照先后顺序执行
加载顺序:静态代码块-->实例代码块-->类构造方法
九、访问权限修饰符:
1、从大到小
(1)、public:修饰公共权限,修饰类、属性、方法。(可以在任意类中访问 )
(2)、protected:修饰受保护的权限,修饰属性、方法。(可以在同包类访问,如果不是同包类,必须是该类的子类才可以访问)
(3)、(default):默认权限,修饰类、属性、方法。(只能在同包的类访问 )
(4)、private:私有权限,修饰属性、方法。( 只能在本类中访问 )
十、面向对象语言的三大特征
(一)、封装
1、概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
(二)、继承
1、一个类只能继承一个类不能继承多个类,但可以多层继承
2、一个类可以被多个类继承
3、java中如果一个类没有使用extends关键字显示其父类,那么这个类默认继承Object类
4、类 java.lang.Object,是类层次结构的根类,即所类的父类。每个类都直接或间接继承Object类。 ,用Object类可以表示任何类
5、继承有优点:
(1)、减少代码冗余,提高代码复用性
(2)、提高代码扩展性
6、方法的重写:
(1)、当父类的方法功能实现不能满足子类需求时,可以对方法进行重写( override).
(2)、子类可以对从父类中继承来的方法进行改造,我在程序执行时,子类的方法将覆盖父类的方法。们称为方法的重写也称为方法的覆盖
注意:(1)、父类私有方法不能重写(2)、跨包的父类默认权限的方法也不能重写
(3)、@Override(注解标记(标签)):表示此类方法是由父类中重写而来,在编译期间,会进行语法检测
7、super关键字
(三)、多态
3、注意:
(1)、变量不存在被子类覆写这一说法,只有方法存在覆写。
(2)、对于非静态成员方法多态情况下:编译时(写代码时)看左边,运行时看右边;对于静态成员方法:编译时、运行时都看左边
4、多态缺点:为了实现多态性,将子类类型向上转为父类类型一旦上升为父类类型,那么就调用不到子类中特有的方法
解决办法:向下转型,为了使用子类中的特有方法,若直接转转不了,使用强制类型转换(注意转换有前提条件)
public class Test2 {
public static void main(String[] args) {
//第三部分:强制转化
Animal dog=new Dog();//Animal 的引用指向Dog的对象
//父类中中存在的方法
dog.sleep();
Animal.show();
//子类中的方法需要强制转化
Dog dog1=(Dog)dog;
((Dog) dog).lookHome();
dog1.lookHome();
}
}
十一、final关键字
1、final 用于修饰类,方法,参数,和属性(成员变量)
所修饰的类:不能被定义为抽象类或是接口,不可被继承
所修饰的方法:子类里不可以重写
所修饰的参数:参数值在方法中不可被修改
十二、抽象类
不能创建对象,其他功能都能被子类正常继承。
当一个具体的类继承抽象类后,要么重写抽象方法,要么将此子类声明为抽象类
十三、接口(Inteface)