Java OOP
对象和封装
面向对象
面向对象设计的过程就是抽象的过程,分以下三步来完成
第一步:发现类
第二步:发现类的属性
第三步:发现类的方法
创建类和对象
类(Class) 和对象(0bject) 是面向对象中的两个核心概念。类是对某一类事物的描述, 是抽象的、既念上的定义。对象是实际存在的.具体的事物个体。类和对象就好比模具和铸件的关系,建筑物图样和建筑物实物的关系。我们可以由一个类创建多个对象。
1.创建类
类主要由属性和行为组成,属性和行为又称为成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包括构造方法等)
2.对象
1.通过构造方法来创建对象
2.通过对象名.属性名的方式调用属
3.通过对象名.方法名的方式调用方法
构造方法及其重载
构造方法
构造方法的名称和类名相同,没有返回值类型。构造方法的主要作用就是在创建对象时执行一些初始化操作。如给成员属性赋初值。
构造方法没有返回值类型。如果有,则不是构造方法,而是和构造方法同名的成员方法。
重载
同一个类,方法名相同,参数列表不同,这称为构造方法的重载可以构诰方法的重载来实现多种初始化行为,在创建对象时可以根据需要选择合适的构造方法。
如果同一个类中包含了两个或两个以上的方法,它们的方法名相同,方法参数的个数或参数类型不同,则称该方法被重载了,这个过程称为方法重载。成员方法和构造方法都可以进行重载。
方法重载的判断
1.必须在同一个类里。
2.方法名相同。
3.参数列表(方法参数等等个数或参数类型)不同。
4.与方法返回值和方法修饰符没有任何关系。
static修饰符
static可以用来修饰属性、方法和代码块。static 修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。通常把static修饰的属性和方法称为类属性(类变量)和类方法。不使用static 修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)和实例方法。
1.类属性和类方法可以通过类 名和对象名访问,实例属性和实例方法只能通过对象名访问。
2.类方法只能访问类属性和其他类方法。
3.静态方法中不能使用this和super关键字。
封装
封装是面向对象的三大特性之一.就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。 通过private、protected、 public 和默认权限的控制符来实现权限的控制。
封装的具体步骤:修改属性的可见性来限制对属性的访问:为每个属性创建一对赋值(stte) 方法和取值(getter) 方法,用于对这些属性的存取:在赋值方法中, 加入对属性的存取控制语句。
封装的好处:隐藏类的实现细节:让使用者只能通过程序规定的方法来访问数据:可以方便地加入存取控制语句,限制不合理操作。加入存取控制语句,限制不合理操作。
封装时会用到多个权限控制符来修饰成员变量和方法:
1.private:成员变量和方法只能在其定义的类中被访问,具有类可见性。
2.默认: 成员变量和方法只能被同一个包里的类访问,具有包可见性。
3.protected; 可以被同一个包中的类访问,被同一个项目中不同包中的子类访问。
4.public; 可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限。
继承
取是面向对象的三大特性之-.是Java中实现代码重用的重要手段之-. Java 中只支持单继。
在Java中,子类可以从父类中继承到哪些” 财产”呢?
1.继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
2.继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
3.无法继承private修饰的属性和方法。
4.无法继承父类的构造方法。
访问修饰符访问权限:
访问修饰符 | 本类 | 同包 | 子类(不同包) | 不同包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
friendly | √ | √ | ||
private | √ |
重写和继承关系中的构造方法
语法:
访问修饰符 子类类名 extends 父类类名{
//父类的抽象方法
}
重写
子类重写父类的构造函数,先调用父类的构造函数,在使用本类自己的构造函数
方法的重写:
特点: 1.具有相同的方法名
2.重写方法之间的参数列表一致
3.父类的重写方法的访问修饰符必须小于子类的访问修饰符
4.父类重写方法的返回值类型必须大于子类的返回值类型
5.父类重写方法的异常要大于子类的异常
super的使用
1.super必须要出现在子类的方法或者构造函数中的第一行
2.可以访问父类的非private的属性,方法,及构造函数
3.super类似于C#的base 用来引用父类的成员
抽象类和抽象方法
抽象类和抽象方法的特点如下:
-
抽象类和抽象方法都通过astrct关键字来修饰。
2.抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
3.抽象方法只有方法声明,没有方法实现。 有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。
final的应用
1.用final修饰的类,不能再被继承
2.用final修饰的方法不能被子类重写
3.用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次.
多态
在一个范畴内不同的展示,还可以提高代码的可扩展性和可维护性。
实现方式:
重载
1.特点:在同一个类的中多态
2.具体要求:
1.在同一个类中相同的方法名
2.不同的参数:
个数不一样
对应下标的类型不一样
重写
1.特点:不同类的多态的体现
2.前提:继承关系
3.具体的要求:
1.在不同类中有相同的方法名,相同的参数
2.访问修饰符:父类小于等于子类
返回值类型:父类大于等于子类不是double和int
抛出异常:父类大于等于子类
4.实现方式:
1.虚方法:
特点:
1.在两个拥有继承关系
2.方法名相同,参数类型,参数个数相同,父类的方法使用关键字vital修饰,拥有方法体,子类必须实现父类的虚方法,子类使override修饰
2.抽象方法
1.特点
1.必须位于抽象类中
2.子类必须重写抽象方法,除非子类也是抽象
3.没有方法体
2.抽象类:
1.特点:抽象类不能被实例化的
2.可以有普通方法也可以有抽象方法
向上向下装换
子类到父类的转换(向上转型)
向上转型后通过父类引用变量调用的方法是子类覆盖或继承父类的方法,通过父类引用变量无法调用子类特有的方法
父类到子类的转换(向下转换)
向下转型后可以访问子类特有的方法。必须转换为父类指向的真实子类类型,否则将出现类型转换异常ClassCastException。
instanceof运算符
语法:
对象 instanceof 类或接口
该运算符用来判断一一个对象是否属于一个类或者实现了一个接口,结果为true或false。在强制类型转换之前通过instanceof 运算符检查对象的真实类型, 再进行相应的强制类型转换, 这样就可以避免类型转换异常.从而提高代码的健壮性。
接口
接口不仅弥补了Java 只支持单继承的缺点,还利于代码的扩展和维护。接口类似于一个组件,需要时可以自由组装。从使用角度来讲,接口和抽象类的区别在于:抽象类利于代码复用,接口利于代码维护。
接口的特点
1.接口不能被实例化
2.成员方法: 只能是抽象方法,使用abstract修饰,默认访问修饰符是:pulic abstract
3.成员变量: 只能定义静态常量,默认访问修饰发:public static final
4.构造方法: 不能够有构造函数
语法:
接口
访问修饰符 interface 接口名 extends 接口1,接口2,..{
//代码块
}
子类引用接口
访问修饰符 类名 implements 接口1,接口2..{
//代码块
}
接口总结
1.接口中的属性都是全局静态常量,接口中的方法都是全局抽象方法,接口中没有构造方法。
2.类只能继承-一个父类,但可以实现多个接口。一个类如果实现了一一个接口,则必须实现接口中的全部方法,否则必须将其定义为抽象类。Java 通过实现接口达到了多重继承的效果。
3.接口表示一种约定,接口表示一种能力。接口体现了约定和实现相分离的原则。
4.抽象类利于代码复用,接口利于代码维护。
5.通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩 展性和可维护性。
6.面向接口编程意味着:开发系统时,主体构架使用接口,接口构成系统的骨架,这样就可以通过更换实现接口的类来实现更换系统。8.C#中接口的成员主要是方法和属性。接口中不能包含常量交量构造方法和任何静态成员。定义接口时显式指定任何修饰符是非法的。