之前的文章也有写道
私有的属性,只能属于当前类,其它类无法使用
构造方法不能被继承,因为构造方法是用来创建当前类对象的,就相当于儿子不能继承父亲的名一样
当然子类也可以拥有自己特有的属性和方法
在Java中只支持单一继承,也就是说一个子类只能有一个父类,但是一个父类可以拥有多个子 类。
作用
提高代码的重用性
继承关键字 extends;
语法格式;
[访问修饰符] class 父类{
//代码
}
[访问修饰符] class 子类 extends 父类{
//代码
}
1.2 super关键字 1.2.1 构造方法问题创建继承类对象输出时,一定会先执行父类中的构造方法(默认执行的无参数的构造方法),然后再执行子类的构造方法。
如果在创建子类对象时,子类有而父类中不存在默认的构造方法,则程序编译错误。
所以想要解决这个问题,就要通过super关键字来指明调用父类的哪个构造方法,从而来创建父类对象。
super关键字super关键字只能用在子类中
super可以表明这个数据是继承父类当中的
格式
属性:super.属性名
方法:super.方法名(参数列表)
构造方法:只有super以super(参数列表)的形式出现在子类构造方法的第一句代码时,就表示 明确了所要使用的父类构造方法。
1.3final关键字final修饰表示最终值,无法修改
格式
final 数据类型 常量名=变量;//常量名一般建议全部大写
final class 类名{
}
//final修饰的类,类不能被继承1.
[访问修饰符] final 子类名 extends 父类名{
//代码
}
//final修饰的方法,方法不能被重写
[访问修饰符] void 方法名(final 数据类型 参数a){
a='A';
}
//final修饰方法中的参数,那么这个参数称为最终参数,在方法中无法对最终参数进行修改
1.4静态变量关键字 static
静态变量在使用时,可以直接通过 类名.属性名 的方式调用
静态变量也可以通过 普通的new对象(对象.属性名) 的方式来调用,但是不建议。
静态变量可以被类中所有的对象共享。
当初始化static修饰的变量值时,初始化值之后的所有变量都会修改(直到初始化新的值)
但是没有被static修饰不会,当初始化一个没有被static修饰的,他只会在new对面之后初始化
而再次新new一次对想则会便会原来值
静态方法静态方法使用时,也是通过 类名.方法名(参数列表) 的形式调用
在静态方法中只能调用静态的属性和方法
而非静态的可以调用静态方法和属性,也可以调用非静态的
静态的也不能使用this和super;
简而言之就是,静态用类名.属性名就可以调用,而非静态的就要用new对象的方式来调用
静态代码块静态代码块位于类的内部,任何方法的外部
语法:
static{
//代码
}
当调用这个类的时候,第一句运行会是代码块
静态代码块主要用来给静态的成员变量进行初始化
1.5方法重写场景:在有继承关系的子类中,对父类中的方法进行重写。
目的:当父类中的方法,无法满足子类的需求时,子类可以再此基础上进行功能的扩展。
定义:子类重写父类的方法,就要和父类中的方法名、返回值类型、参数列表和参数列表内的参数顺序,数量和个数完全一致,而且访问修饰符的范围不能被缩小。
1.6 多态多态有两种表现形式:
方法重载(也被称为 编译时多态,也就是说编译期间已经明确了,要调用哪个方法)
方法重写(也被称为 运行时多态,因为动态绑定机制的原因,只有运行时才能知道这个对象 是谁)
1.6.1 向上转型向上转型,就是把一个子类对象赋值给父类,类似于基本数据类型中的自动类型转换。因为,父类本身就包含了子类这种类型。
语法
父类 对象名=new 子类(参数列表);
向上转型可以当作父类对象来使用,可以调用父类中所有的变量和方法,但是如果这个方法被子类重写,则会调用重写过后的方法。因为,用向上转型的对象调用被子 类重写的方法时,会发生动态绑定机制。
绑定机制:在程序运行时,会判断当前对象的真正的创建者(通过构造方法来决定),谁真正创建的这个对象,就调用谁里面的方法。
1.6.2 向下转型向下转型,就类似于基本数据类型中的强制类型转换,;所以把一个父类对象,强制转换成子类,需要加上强制类型转换符。
语法
子类 对象名=(子类) 对象(向上转型的对象名);
向下转型,一定是建立在向上转型的基础上,做类型的还原。不能直接把一个父类对象,强制转换 成子类。
因为,向下转型容易发生ClassCastException类型转换异常,所以,在进行向下转型的时候,建议 通过 instanceof关键字,来判断当前对象是否属于某个类,如果返回的结果是true,则表明可以进 行向下转型;否则,就转不了。
instanceof 关键字用法:
对象名 instanceof 类或接口名;
可以用if判断来判断是否能向下转型
if((向上转型的对象名) instanceof 子类名或接口名)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)