面向对象~
一、面向过程和面向对象
面向过程(POP)是把问题分解成一个接一个步骤,然后把具体步骤一一实现,代表有C语言
面向对象(OOP)是先把问题分类,再对每个类进行详细设计分析每个类具有的属性和行为,代表有JAVA,C++
比如洗衣服,用面向过程的思想就会把它拆分为:打开洗衣机->放入衣服->倒洗衣液->启动洗衣机;而面向对象会把它拆分为人和洗衣机两个对象:人有打开洗衣机,把衣服放进洗衣机和倒入洗衣液三个行为也叫方法,洗衣机有启动和停止工作两个行为。
相比于面向过程,面向对象更易于复用,扩展和维护
总而言之,面向对象是从宏观上对事物进行设计,详细设计还是基于面向过程的,面向对象和面向过程是相辅相成的。
二、JAVA中的类
类是对一类具有共同特征的事物的抽象
定义:[访问修饰符] [修饰符] class 类名 {
成员变量
成员方法
构造方法
内部类
代码块
}
关键字class 用来定义类
类的访问修饰符有private,protected,default,public
private,protected处可以修饰类,还可以修饰属性和方法
private protected default public
同类 ---
同包 --- ---
不同包的子类 --- --- ---
不同包的不同类 --- --- --- ---
public修饰类时,类名需与文件名一致,且一个java文件只能由一个public类
类的修饰符有abstract,static,final
static:表示静态,被其修饰的变量和方法可以直接通过类名调用
abstract:修饰类时类为抽象类,修饰方法为抽象方法
抽象类和普通类的区别就是抽象类不能实例化对象,、
抽象方法只有声明,没有方法体
当类中有抽象方法时也必须定义为抽象类
继承抽象类的非抽象类必须实现父类的所有抽象方法,否则也需定义成抽象类
final关键字:修饰类时类不能有子类,也不能被定义为抽象类或接口
修饰方法时不能被重写
修饰变量时初始化后值不能再改变。赋值分为两种情况:1是声明时同时初始化, 通常和static一起使用,2是在构造方法中对其初始化
类的构造方法即对对象进行初始化
类的成员变量作用范围为整个类体,如果未对其初始化,JAVA 会自动为其初始化
三、JAVA中的对象
对象是类的实例
声明:类名 对象名 = new 类名(); 等号左边声明了一个对象,是引用类型变量,指向等号右边在内存空间中为对象开辟的一块地址
对象1=对象2:对象本身并没有被复制,复制的是对象引用,即两个对象指向同一个地址
四、类和对象
同一类的每个对象有自己不同的成员变量存储空间,共享类中定义的成员方法
对象是类的实例,类是对象的抽象
声明对象也叫实例化对象
五、变量分类和方法分类
变量分为成员变量和局部变量
成员变量:定义在类中,方法体外,可以不进行初始化,JAVA 会自动对其初始化,默认值为各数据类型的默认值
局部变量:定义在方法体内,必须在声明的同时进行初始化
方法的形参也属于局部变量
方法有成员方法和构造方法
成员方法定义在类中。
定义:
修饰符 返回值类型 方法名( 参数列表) {
方法体语句;
[return 返回值]
}
六、构造方法
构造方法用于初始化对象,名称与类名相同,无返回值也无需void修饰,默认是无参的,在new对象时自动生成;
一个类可以有多个构造方法,有参的和无参的;
一旦显式定义了一个有参的构造方法,默认的无参构造方法即失效。
七、方法的重载
方法的重载是指方法名称相同,参数不同(参数个数,类型,顺序),与返回值无关
调用时,会根据不同的参数表选择对应的方法
八、值传递和引用传递
值传递:指在调用函数中,将实际参数复制一份传递到函数中,后续如果在函数中对参数进行修改,是不会影响到实际参数的。形参数据类型是基本数据类型
eg:public class TestValue {
public void test(int x){x = 20;//变量x值发生变化,与a没有任何关系的 } public static void main(String[] args) {TestValue t = new TestValue();int a = 10;t.test(a);//传递的是基本类型,可是用a的值实际填充了x, 是两个不相干的变量System.out.println(a);//? }
}
引用传递:指在调用函数中,将实际参数的地址传递到函数中,后续如果在函数中对参数进行修改,将会影响到实际参数。(String 类型除外)形参数据类型是引用数据类型
eg:public class TestRef {
public void test(Person p){//p = p1 = 1001 指向的是同一个对象p.name = "李四"; } public static void main(String[] args) {TestRef t = new TestRef();Person p1 = new Person(); //p1=1001p1.name = "张三";p1.age = 20;t.test(p1);//对于引用类型,只是将对象的引用地址值传递System.out.println(p1.name);// }
}
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象
本身 。
九、this关键字和static关键字
this 关键字代表当前对象,一般使用在类的有参构造方法中,用来区分成员变量和局部变量
eg:public class Main{
private int a;
}
public Main(int m){
this.a=m;
}
static是静态的意思,通常用来修饰类的属性,方法,代码块以及内部类
随着类的加载而加载
优先于对象存在
修饰的成员被所有对象共享
可不创建对象,直接被类调用
被static修饰的方法叫做静态方法,否则就是非静态方法
在修饰方法的时候,静态方法里不能访问类的非静态的属性,非静态方法可以访问静态属性
代码块在类中声明,分为实例代码块和静态代码块,是用{}括起来的方法体
实例代码块:每次创建对象时自动调用
{
代码
}
静态代码块:类加载时调用且只调用一次,调用后永远存在
static {
代码
}
执行顺序:静态代码块,实例代码块,构造方法
十、包
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间
导入外部包的类需要使用import关键字,需要写全类名,java.lang下的包不需要导入,可直接使用
十一、面向对象三大特征
面向对象三大特征为封装,继承,多态
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
通常体现在设置不同的访问权限和私有属性的get()和set()方法
封装并不只是通过private来实现
继承:即子类继承父类(也叫基类),使用extends关键字,继承之后子类可以调用父类的所有非私 有属性和方法
Object类是所有类的父类,当一个类没有为它指定父类时,Object就是它的父类
java不允许多继承,一个类只能有一个直接父类
子类继承父类时,子类构造方法会先调用父类构造方法,使用super关键字来调用且必须卸载子类构造方法的第一行,若无显示调用,则系统会默认调用父类的无参构造方法
super关键字:用来访问父类成员,它并不是父类对象,而是把父类中的信息加载到子类中存储
eg:super.成员变量;super.构造方法;super.普通方法
方法的重写(Override):当父类方法不能满足子类需求时就需要重写父类方法,使用@Override注解标签可以强制检查语法
规则:方法名相同、参数列表相同,返回值类型相同,访问权限不能小于父类权限
其中,构造方法、静态方法不能重写,成员变量也不存在重写
多态:指同一事物在不同时刻表现不同的形态 父类 对象名=new 子类();
使用条件:继承,重写,父类引用指向子类对象(即编译类型是父类,运行类型是子类)
多态环境下对成员方法的调用:编译看左边,运行看右边
多态环境下对静态成员方法和成员变量的调用:编译和运行都看左边
优点:子类默认向上转为父类类型,提高了程序的扩展性
缺点:不能访问子类中特有的方法
解决:向下转型
十二、接口
接口是一种特殊的抽象类;类与接口之间存在实现关系,用implements关键字实现,同时要实现接口的所有抽象方法,否则需定义为抽象类;一个类可以实现多个接口;接口与实现类间存在多态性;接口之间可以有继承关系
jdk8以前,接口中只能定义抽象方法和静态常量
jdk8以后,还可以定义默认方法和静态方法
面向对象~
一、面向过程和面向对象
面向过程(POP)是把问题分解成一个接一个步骤,然后把具体步骤一一实现,代表有C语言
面向对象(OOP)是先把问题分类,再对每个类进行详细设计分析每个类具有的属性和行为,代表有JAVA,C++
比如洗衣服,用面向过程的思想就会把它拆分为:打开洗衣机->放入衣服->倒洗衣液->启动洗衣机;而面向对象会把它拆分为人和洗衣机两个对象:人有打开洗衣机,把衣服放进洗衣机和倒入洗衣液三个行为也叫方法,洗衣机有启动和停止工作两个行为。
相比于面向过程,面向对象更易于复用,扩展和维护
总而言之,面向对象是从宏观上对事物进行设计,详细设计还是基于面向过程的,面向对象和面向过程是相辅相成的。
二、JAVA中的类
类是对一类具有共同特征的事物的抽象
定义:[访问修饰符] [修饰符] class 类名 {
成员变量
成员方法
构造方法
内部类
代码块
}
关键字class 用来定义类
类的访问修饰符有private,protected,default,public
private,protected处可以修饰类,还可以修饰属性和方法
private protected default public
同类 ---
同包 --- ---
不同包的子类 --- --- ---
不同包的不同类 --- --- --- ---
public修饰类时,类名需与文件名一致,且一个java文件只能由一个public类
类的修饰符有abstract,static,final
static:表示静态,被其修饰的变量和方法可以直接通过类名调用
abstract:修饰类时类为抽象类,修饰方法为抽象方法
抽象类和普通类的区别就是抽象类不能实例化对象,、
抽象方法只有声明,没有方法体
当类中有抽象方法时也必须定义为抽象类
继承抽象类的非抽象类必须实现父类的所有抽象方法,否则也需定义成抽象类
final关键字:修饰类时类不能有子类,也不能被定义为抽象类或接口
修饰方法时不能被重写
修饰变量时初始化后值不能再改变。赋值分为两种情况:1是声明时同时初始化, 通常和static一起使用,2是在构造方法中对其初始化
类的构造方法即对对象进行初始化
类的成员变量作用范围为整个类体,如果未对其初始化,JAVA 会自动为其初始化
三、JAVA中的对象
对象是类的实例
声明:类名 对象名 = new 类名(); 等号左边声明了一个对象,是引用类型变量,指向等号右边在内存空间中为对象开辟的一块地址
对象1=对象2:对象本身并没有被复制,复制的是对象引用,即两个对象指向同一个地址
四、类和对象
同一类的每个对象有自己不同的成员变量存储空间,共享类中定义的成员方法
对象是类的实例,类是对象的抽象
声明对象也叫实例化对象
五、变量分类和方法分类
变量分为成员变量和局部变量
成员变量:定义在类中,方法体外,可以不进行初始化,JAVA 会自动对其初始化,默认值为各数据类型的默认值
局部变量:定义在方法体内,必须在声明的同时进行初始化
方法的形参也属于局部变量
方法有成员方法和构造方法
成员方法定义在类中。
定义:
修饰符 返回值类型 方法名( 参数列表) {
方法体语句;
[return 返回值]
}
六、构造方法
构造方法用于初始化对象,名称与类名相同,无返回值也无需void修饰,默认是无参的,在new对象时自动生成;
一个类可以有多个构造方法,有参的和无参的;
一旦显式定义了一个有参的构造方法,默认的无参构造方法即失效。
七、方法的重载
方法的重载是指方法名称相同,参数不同(参数个数,类型,顺序),与返回值无关
调用时,会根据不同的参数表选择对应的方法
八、值传递和引用传递
值传递:指在调用函数中,将实际参数复制一份传递到函数中,后续如果在函数中对参数进行修改,是不会影响到实际参数的。形参数据类型是基本数据类型
eg:public class TestValue {
public void test(int x){x = 20;//变量x值发生变化,与a没有任何关系的 } public static void main(String[] args) {TestValue t = new TestValue();int a = 10;t.test(a);//传递的是基本类型,可是用a的值实际填充了x, 是两个不相干的变量System.out.println(a);//? }
}
引用传递:指在调用函数中,将实际参数的地址传递到函数中,后续如果在函数中对参数进行修改,将会影响到实际参数。(String 类型除外)形参数据类型是引用数据类型
eg:public class TestRef {
public void test(Person p){//p = p1 = 1001 指向的是同一个对象p.name = "李四"; } public static void main(String[] args) {TestRef t = new TestRef();Person p1 = new Person(); //p1=1001p1.name = "张三";p1.age = 20;t.test(p1);//对于引用类型,只是将对象的引用地址值传递System.out.println(p1.name);// }
}
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象
本身 。
九、this关键字和static关键字
this 关键字代表当前对象,一般使用在类的有参构造方法中,用来区分成员变量和局部变量
eg:public class Main{
private int a;
}
public Main(int m){
this.a=m;
}
static是静态的意思,通常用来修饰类的属性,方法,代码块以及内部类
随着类的加载而加载
优先于对象存在
修饰的成员被所有对象共享
可不创建对象,直接被类调用
被static修饰的方法叫做静态方法,否则就是非静态方法
在修饰方法的时候,静态方法里不能访问类的非静态的属性,非静态方法可以访问静态属性
代码块在类中声明,分为实例代码块和静态代码块,是用{}括起来的方法体
实例代码块:每次创建对象时自动调用
{
代码
}
静态代码块:类加载时调用且只调用一次,调用后永远存在
static {
代码
}
执行顺序:静态代码块,实例代码块,构造方法
十、包
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间
导入外部包的类需要使用import关键字,需要写全类名,java.lang下的包不需要导入,可直接使用
十一、面向对象三大特征
面向对象三大特征为封装,继承,多态
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
通常体现在设置不同的访问权限和私有属性的get()和set()方法
封装并不只是通过private来实现
继承:即子类继承父类(也叫基类),使用extends关键字,继承之后子类可以调用父类的所有非私 有属性和方法
Object类是所有类的父类,当一个类没有为它指定父类时,Object就是它的父类
java不允许多继承,一个类只能有一个直接父类
子类继承父类时,子类构造方法会先调用父类构造方法,使用super关键字来调用且必须卸载子类构造方法的第一行,若无显示调用,则系统会默认调用父类的无参构造方法
super关键字:用来访问父类成员,它并不是父类对象,而是把父类中的信息加载到子类中存储
eg:super.成员变量;super.构造方法;super.普通方法
方法的重写(Override):当父类方法不能满足子类需求时就需要重写父类方法,使用@Override注解标签可以强制检查语法
规则:方法名相同、参数列表相同,返回值类型相同,访问权限不能小于父类权限
其中,构造方法、静态方法不能重写,成员变量也不存在重写
多态:指同一事物在不同时刻表现不同的形态 父类 对象名=new 子类();
使用条件:继承,重写,父类引用指向子类对象(即编译类型是父类,运行类型是子类)
多态环境下对成员方法的调用:编译看左边,运行看右边
多态环境下对静态成员方法和成员变量的调用:编译和运行都看左边
优点:子类默认向上转为父类类型,提高了程序的扩展性
缺点:不能访问子类中特有的方法
解决:向下转型
十二、接口
接口是一种特殊的抽象类;类与接口之间存在实现关系,用implements关键字实现,同时要实现接口的所有抽象方法,否则需定义为抽象类;一个类可以实现多个接口;接口与实现类间存在多态性;接口之间可以有继承关系
jdk8以前,接口中只能定义抽象方法和静态常量
jdk8以后,还可以定义默认方法和静态方法