继承是面向对象最显著的一个特征
继承是从已有的类中派生出新的类新生类能吸收已有类的数据属性和行为,并扩展新的能力
java继承是会用已存在的类的定义作为基础建立新类的技术
新类的定义使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用
1.使用sxtends关键字来表示继承关系。
2.相当于子类把父类的功能复制了一份。
3.java只支持单继承。
4.继承可以传递。
5.继承多用于功能的修改。子类可以在拥有父类功能的同时,进行功能拓展。
6.像是is a 的关系。
//本类用作继承的入门案例
public class ExtendsDemo(){
main{
//5.创建三个类的对象
Animal a = new Animal();
Cat c = new Cat();
MaioMaio m = new MiaoMiao();
//6.利用对象调用方法进行测试
a.eat();
c.eat();//爸爸类可以使用爷爷的方法
m.eat();//孙子类可以使用爷爷类的方法
/**3.继承还具有传递性,爷爷的功能会传给爸爸,爸爸的功能会传给孙子*/
}
}
/**我们通过extends关键字建立子类与父类的继承关系。格式:子类extends 父类*/
/**java只支持单继承,一个子类只能有一个父类,但是一个父类可以有多个子类*/
//1.创建一个爷爷类
class Animal{
//添加爷爷类的方法
public void eat(){
//sout是生成打印语句的快捷方式
println(“小动物Animal爱吃啥吃啥”)
}
}
//2.创建爸爸类,并与Animal类建立继承关系
/**6.继承是is a 的关系,比如小猫是小动物,miaomiao是一只小猫
*继承要求子类必须是父类的一种下属类型,依赖性非常强,强耦合*/
class Cat extends Animal{
//7.定义爸爸类中的属性--成员变量
int a = 10;//普通属性
private int b = 100;//私有属性
}
//3.创建孙子类,并与Cat类建立继承关系
class MiaoMiao extends Cat{
/**4.子类可以拥有自己独有的方法,实现了功能的扩展,青出于蓝而胜于蓝*/
//8.定义孙子类独有的方法
public void studyJava(){
println(“正在学java”);
/**子类继承了父类以后,可以使用父类的所有非私有资源
*注意:这个私有资源是由于子类不可见而不能使用的,不是因为没有继承
*因为子类在继承了父类以后,相当于把父类的功能完全复制了一份*/
println(a);//可以使用父类的非私有资源
//println(b);//不可以使用父类的私有资源,会报错
}
}
可以通过这个关键字使用父类的内容,super代表的是父类的一个引用对象
注意:在构造方法里,出现的位置必须是第一行。
1.继承以后,子类就拥有了父类的功能
2.在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
3,子类中方法的签名与父类完全一样时,会发生覆盖
4.注意:父类的私有方法不能被重写
/*本类用于测试继承中成员变量的使用*/
public class TestExtends1{
mian{
//5.创建对象进行测试
Son s = new Son();
s.eat();
}
}
//创建父类
class Father{
//6.定义父类的成员变量
int count = 1;
int sum = 2;
}
//2.创建子类
class Son extends Father{
//4.1.定义子类的成员变量
int sum = 100;
//3.定义子类的普通方法
public void eat(){
//4.2定义子类的局部变量
int sum = 10;
println(sum);//打印子类的局部变量sum
println(this.sum);//打印子类的成员变量sum
/**在子类中使用父类的sum资源,需要使用super进行指定
*super表示父类的对象,可以理解为Father super = new Father();*/
//7.使用父类的成员变量
println(count);//使用父类不重名的成员变量
println(super.sum);//使用父类重名的成员变量
}
}
/*本类用于测试继承中构造方法的使用*/
/*1.子类创建对象时,默认会先去调用父类的构造方法*/
/*2.原因是由于子类构造函数的第一行默认存在super()--表示调用父类的无参构造*/
/*3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造*/
/*4.构造方法不可以被继承,因为语法原因,构造要求与类同名,所以天然不符合要求*/
public class text2(){
main{
//5.创建对象进行测试
Father2 f2 = new Father2();
Son2 s2 = new Son2();
Son2 s3 = new Son2();
}
}
//1.创建父类
class Father2{
//什么也不写是默认修饰符,默认修饰符同包可见,所以要改名字
//3.创建父类的无参构造
public Fateher2(){
println(我是Father2的无参构造);
}
}
//2.创建子类
class Son2 extends Fateher2{
//4.创建子类的无参构造
public Son2(){
println(我是son2类的无参构造);
}
}
/*本类用于测试继承方法的使用*/
/*方法的重写:继承后,子类对父类的功能不满意,就可以重写父类的功能*/
*重写的语法规则:两同,两小 一大
*一大:子类方法的修饰符范围>=父类方法的修饰符范围--指的是访问控制符
*两同:方法名相同,参数列表相同
*两小:子类方法的返回值<=父类方法的返回值类型(返回值类型指的是继承关系的大小,而不是返回值)
*注意:如果父类方法的返回值类型是void,子类保持一致即可
*注意:子类不可以重写父类的私有方法,还是因为不可见。
*子类方法的异常类型<=父类方法抛出的异常类型*/
public class Testtends3{
main{
//4.创建父子类对象
Father3 f3 = new Father3();
Son3 s3 = new Son3();
f3.eat();
s3.eat();/*1.继承后,子类可以使用父类的非私有资源*/
/*如果子类对父类的功能进行了重写,调用的是重写后的功能*/
}
}
//1.创建父类
class Father3{
//3.创建父类的普通方法
public void eat(){
println("爸爸爱吃肉");
}
public void play(){
println(“爸爸爱放风筝”);
}
}
//2.创建子类
class Son3 extends Father3{
//新建子类特有的功能
public void studyJava(){
println("我拓展了学java的功能");
}
//6.对父类的方法进行重写
@Override/*4.@Overrride这是一个注解,可以理解成一个标签,
《Method does not override method from its superclass--这个方法并没有重写父类的方法》
标记这个方法是一个重写的方法*/
public void eat(){
println("儿子爱吃蔬菜");
}
}
使用extends建立子类与父类的继承关系
子类继承父类相当于子类把父类的功能复制了一份,但注意,构造方法不能
被继承。
3.继承后,子类可以使用父类的所有非私有资源,私有资源不可用的原因是不可见
4.java只支持单继承,一个子类只能有一个父类,但是一个父类可以有多个子类。
5.继承具有传递性,爷爷的功能会传给爸爸,爸爸的功能会传给孙子。
6.继承是强耦合关联性非常强的is a 关系。
super可以在父类成员变量与子类成员变量同名时,用过super,变量名的
方式调用父类的构造方法,子类的构造方法首行默认存在super();表示调用父类的
无参构造,如果没有父类的无参构造,需要手动提供父类的其他含参构造供子类
调用。
tips:子类其实并不关心调用的是父类的那个构造方法,只是需要先调用一个父类的构造
方法而已,所以每次创建子类对象时,都会先调用父类的构造方法,再调用子类的构造方法
注意:构造方法的调用只能在构造方法的首行。
前提:
子类继承父类以后,对父类的功能做改进
语法规则:子类的方法与父类的方法名+参数列表相同
一大:子类方法的修饰符>=父类方法的修饰符
两小:子类方法的返回值类型<=父类方法的返回值类型
注意:我们在重写规则中提到的方法的返回值类型的大小,指的不是值的大小
【byte与int】,我们这里值得大小是说:子类方法的返回值类型必须是父类方法返回值
类型的子类或者是同一类型。
比如父类是:void,子类是void
比如父类是:Cat,子类是miaomiao
1.This代表本类对象的引用
class Cat{this.XXX}可以理解成:Cat this = new Cat();
2.super代表父类对象的引用。
class Father{}
class Son extends Father{super.XXX}
可以理解成:Father super = new Father();
3.this可以在两个变量名相同时,用于区分成员变量和局部变量
4.this可以在本类的构造方法之间调用,位置必须是第一条语句,注意:不能相互调用,会死循环
5。super是发生了继承关系以后,子类如果想用父类的功能,可以通过super调用
6.如果发生了重写,还想用父类的功能,需要使用super来调用
7.Super在调用父类的构造方法时,必须出现在子类构造方法的第一条语句,而且如果父类
中没有提供无参构造,子类可以通过super来调用父类其他的含参构造。
1.重载:是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同
2.重写:是指发生了继承关系以后(两个类),子类去修改父类原有的功能
语法规则:子类的方法签名(返回值类型 方法名 (参数列表))与父类一致
重写方法的修饰符:子类权限>=父类的权限
3.重载的意义:是为了方便外界对方法进行调用,什么样的程序都可以找到对应的方法
来执行。体现的是程序的灵活性。
4.重写的意义:实在不修改源码的前提下,进行功能的修改和拓展
(OCP原则:面向修改关闭。面向拓展开放)