因为在之前的文章中又提到构造器,而且下文例子中也有构造器的使用,所以我们先来看一下构造器。
构造器也称为构造方法,其作用就是在new的同时,对成员变量进行赋值,给对象的属性赋予初始值,其格式为:
权限 类名(参数列表){
方法体
}从上可以看出,构造方法是不允许写返回值的,但不代表它没有返回值,因为它是用于new对象的,所以返回值也就是类对象本身;二是方法名必须和类名完全一致。
构造方法的写法有了,那么它是怎么运行的呢?构造方法在new的时候自动运行,只运行一次。每new一次都会运行一次。
每个class中都要有构造方法,如果不手动创建,那么Java会在编译的时候自动去添加一个无参的构造方法,如果有,那么就不会自动添加。另外,接口(interface)中是不允许出现构造方法的,所以接口不能new。
在Java中,封装 一是用来隐藏对象的属性和实现细节,仅仅对外公开接口,从而控制程序中属性的读写访问级别,二是用来提高代码的复用性,如下例子:
public class Person{
/** 名字属性 */
private String name;
/** 年龄属性 */
private int age;
/** 性别属性 */
private String gender;
/** 构造器 */
public Person(String gender){
this.gender = gender
}
/** 设置姓名 */
public void setName(String name){
this.name = name;
}
/** 获取姓名 */
public String getName(){
return this.name;
}
/** 设置年龄 */
public void setAge(int age){
this.age = age;
}
/** 获取年龄 */
public int getAge(){
return this.age;
}
/** 获取性别 */
public String getGender(){
return this.gender;
}
}
public class Test01{
public static void main (String[] args){
Person person = new Person("男");
person.setName("张三");
person.setAge("18");
}
}在这个例子中,因为人的性别的不变的(正常情况下),所以我们采用构造器对性别属性进行了初始化,并将属性权限设置为私有的,并且没有添加设置方法,所以初始化后的性别是不允许修改的。但是姓名和年龄是允许修改的,所有我们虽然属性是私有的,但是我们添加了对外的接口,也就是set方法,这便使其可以修改了。
继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有类称作父类。子类会自动拥有父类中“可以”继承的属性和方法。在子类中,可以直接调用父类的成员变量及方法。继承的格式如下:
权限修饰符 class 子类名 extends 父类名{
内容
}好处
弊端
类与类之间的耦合度过高。
特点
注意
成员变量和成员方法的继承关系
抽象方法
使用关键字abstract修饰并没有方法体的方法,称之为抽象方法。必须存在于抽象类中。
抽象类
抽象类是一些具有相同特征的类不断的进行共性收取出来的类,使用关键字abstract表明它是一个抽象类,并且它一定是一个父类。
抽象类在使用时要定义子类继承抽象类,将抽象类进行重写,创建子类的对象。其子类只有重写了抽象类中的所有方法后,才能创建对象,否则该子类还是一个抽象类。
下面是个例子:
public abstract class Test02{
public int sum(int a, int b);
public double avg(int a, int b);
}
public class Test02 extends Text02{
public int sum(int a, int b){
return a+b;
}
public double avg(int a, int b){
return (a+b)/2;
}
}接口就是一个公共的模范标准,只要符合规范标准,都可以使用,使用关键字interface进行标明,并且是一个引用数据类型。其格式如下:
public interface 接口名称{
//接口内容(最重要的内容是抽象方法)
}接口中可以包含的内容
在jdk7之前,只可以包含常量和抽象方法。
jdk8中新增了默认方法和抽象方法。默认方法可以通过接口的实现类对象直接调用,也可以被接口的实现类进行覆盖重写。静态方法不能通过接口实现类对象来调用,只能通过接口的名称,直接调用接口的静态方法。
jdk9中又增加了私有方法。静态私有方法,解决静态方法之间重复代码的问题普通私有方法,解决多个默认方法之间重复代码的问题。
使用
上文说到,因为接口没有构造器,所有不能new,因此接口不能直接使用,必须有一个“实现类”通过关键字implements“实现”该接口,且必须重写接口中的所有抽象方法 ,其格式如下
public calss 实现类名 implements 接口名称{
}定义接口要注意以下几点:
一个对象拥有多种形态,就是对象的多态性,继承和接口的实现为多态产生了前提。代码中的多态性,就是父类引用指向子类的对象,其使用方法如下:
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();多态情况下,访问成员变量也有所不同:一种是直接通过对象名称访问成员变量,这个时候要看等于号左边是谁就优先用谁,没有则向上找;二是间接通过成员方法访问成员变量,这个时候要看该方法属于谁,如果子类没有重写方法,那方法就属于父类,如果子类重写了方法,那方法就属于子类。
多态的转型
多态转型分向上转型和向下转型:
向上转型就是右侧创建一个子类的对象,把他当作父类来看待使用,类似于数据类型的自动转换。向上转型一定是安全的,但是一旦向上转型,将无法调用子类原本的特有内容。向上转型格式如下:
父类名称 对象名 = new 子类名称();向下转型就是将父类的对象,“还原”成本来的子类对象,类似于数据类型强制转换。需要注意的是要把 x 类的对象向下转型,必须保证对象本来创建的时候就是 x 类,才能向下转型。向下转型格式如下:
子类名称 对象名 = (子类名称)父类对象;