1类和对象
1.1定义类
类是某一批对象的抽象,可以把类理解成某种概念;对象是一个具体存在的实体。
定义类的格式:
[修饰符] class 类名 {
//0至n个属性
数据类型 变量名1;
数据类型 变量名2;
//0至n个方法
修饰符 返回值类型 方法名(参数){
执行语句;
}
定义构造器的格式:
[修饰符] 构造器名(形参列表)
{
//零到多个可执行语句
}
注意:修饰符可以省略,也可以是public ,protected,private其中之一;构造器名必须和类名相同;形参列表和定义方法的格式相同。构造器不能定义返回值类型,也不能使用void声明构造器没有返回值。
一个类中包含三种最常见的成员:构造器,成员变量和方法。三种成员都可以定义零个或多个。类里各成员之间的定义顺序没有任何影响,各成员之间可以相互调用,但是static修饰的成员不能访问没有static修饰的成员(有static修饰的属于类本身,没有static修饰的属于该类的实例)。
成员变量用于定义该类或该类的实例所包含的状态数据,方法用于定义该类或者该类实例的行为特征或者功能的实现。构造器用于构造该类的实例,java语言通过new关键字来调用构造器,从而返回该类的实例。
1.2 创建对象
创建对象的根本途径是构造器,通过new关键字调用该类构造器即可创建该类对象。创建对象的格式:类名对象名 = new 类名();
如果访问权限允许,类里定义的方法和成员变量都可以通过类或实例来调用。类或实例访问方法或成员变量的语法:类.类变量|方法,或者实例.实例变量|方法。static修饰的成员变量或方法,既可以类来调用,也可通过实例来调用;没有static修饰的成员变量或者方法只能通过实例来调用。
2. 封装
2.1 封装概述
封装是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象的内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。封装的好处:提高了代码的复用性;隐藏了实现细节,对外提供公共的访问方式,便于调用者使用;提高了安全性。
2.2 private关键字
private:私有的意思。可以修饰成员变量和成员方法。特点:被private修饰的内容,只能在本类中访问。
2.3 JavaBean规范
JavaBean 是一种JAVA语言写成的可重用组件.
1):类必须使用public修饰.
2):必须保证有公共无参数构造器,即使手动提供了带参数的构造器,也得提供无参数构造器..
3):包含了属性的操作手段(给属性赋值,获取属性值).
2.4 this关键字
Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置不同,this作为对象的默认引用有两种情形:构造器中,表示当前创建的对象;方法中, 哪一个对象调用this所在的方法,那么此时this就表示哪一个对象。
3. 继承
3.1 继承概述
继承是面向对象的三大特征之一,也是实现软件复用的重要手段。Java的继承具有单继承的特点,每个子类只有一个直接父类。
3.2 继承的特点
Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类或基类,超类。
3.2.1 继承的语法格式: 修饰符 class 子类 extends 父类{
}
3.2.2继承的好处:
1.继承提高了代码的复用性,提高了软件开发效率;
2.继承让类与类之间产生了关系,是多态的前提。
注意:
1.在java中类只支持单继承,不支持多继承。即一个类只能有一个直接父类;
2.多个类可以继承一个父类;
3.在java中允许存在多层继承。即一个类的父类可以再去继承其它父类;
4.在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类;
5.子类继承了父类,将可以得到父类的全部成员变量和方法,但是java的子类不能获得父类的构造器。
3.3. 重写父类方法
3.3.1子父类中成员方法的特点
当程序通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中的方法。
3.3.2方法覆盖
子类中出现和父类一模一样的方法时,会出现方法覆盖,也称方法重写。
3.3.3方法重写的应用
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
在子类中,访问父类中的成员方法格式: super.父类中的成员方法();
3.3.4方法重写的原则(一同两小一大):
一同:
① 实例方法签名必须相同。 (方法签名= 方法名 + 方法的参数列表)
两小:
② 子类方法的返回值类型是和父类方法的返回类型相同或者是其子类。子类可以返回一个更加具体的类.
③ 子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或者是其子类。子类方法中声明抛出的异常小于或等于父类方法声明抛出异常类型;子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(RuntimeException类型除外);
一大:
④ 子类方法的访问权限比父类方法访问权 限更大或相等。
private修饰的方法不能被子类所继承,也就不存在覆盖的概念.
判断是否是覆写方法的必杀技:@Override标签:若方法是覆写方法,在方法前或上贴上该标签, 编译通过,否则,编译出错。只有方法存在覆盖的概念,字段没有覆盖.
4.多态
4.1 多态概述
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型与运行时类型不一致,就可能出现多态。多态体现:父类引用变量指向子类对象。多态的前提:必须有子父类关系或者类实现接口。使用多态后父类引用变量调用方法时,会调用子类重写后的方法。
4.2 多态的定义格式
父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
1.普通类多态定义的格式
父类 变量名 = new 子类();
如: class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
2.抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
如:abstractclass Fu {
public abstract voidmethod();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
Fu fu= new Zi();
3.接口多态定义的格式
接口 变量名 = new 接口实现类();
如: interfaceFu {
public abstract void method();
}
class Zi implements Fu {
publicvoid method(){
System.out.println(“重写接口抽象方法”);
}
}
Fu fu = new Zi();
4.3 多态成员变量与成员方法的特点
1.多态成员变量
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
运行时期:也是调用引用型变量所属的类中的成员变量。
简记:编译和运行都参考等号的左边。编译运行看左边。
2.多态成员方法
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。
简记:编译看左边,运行看右边。
4.4 instanceof运算符
boolean b = 对象 instanceof 数据类型;
Instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,它用于判断前面的对象是否是后面的类,或者其子类,实现类的实例。如果是返回true,否则返回false。
Instanceof运算符的作用:在进行强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功转换。Instanceof和(type)是java提供的两个相关的运算符,通常先用instanceof判断一个对象是否可以强制类型转换,然后再使用(type)运算符进行强制类型转换,从而保证程序不会出现错误。
4.5 多态的转型
1.向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:父类类型 变量名 = new 子类类型();
如:Person p =new Student();
2.向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
使用格式:子类类型 变量名 = (子类类型) 父类类型的变量;
如: Student stu = (Student) p; //变量p 实际上指向Student对象
4.6 多态优缺点
多态的好处:提高了程序的扩展性
多态的弊端:不能访问子类的特有功能
总结:
封装:把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
继承:子类会自动拥有父类所有可继承的属性和方法。
多态:配合继承与方法重写提高了代码的复用性与扩展性;如果没有方法重写,则多态同样没有意义。