传智播客Java学习之类的继承
目录
首先我来写两个代码:
l继承概述
继承的案例和继承的好处
Java中继承的特点
Java中继承的注意事项
super关键字
继承中成员方法的关系
总结
首先我来写两个代码:
//定义学生类
class Student {String name;int age;public Student(){}//getXxx()/setXxx()public void eat() {System.out.println("吃饭");}}
//定义老师类
class Teacher {String name;int age;public Teacher(){}//getXxx()/setXxx()public void eat() {System.out.println("吃饭");}}
我们观察上面两个代码:
发现name,age成员变量,以及getXxx()/setXxx(),还有eat()等都是相同的。
如果我们后来继续定义类,举例:工人类,军人类。他们是不是也具备这些内容。
那么,我们每一次定义这样的类的时候,都要把这些重复的内容都重新定义一遍。
麻烦不?麻烦。所以,我们要考虑改进?
如何改进呢?
我这想的:我能不能把这些相同的内容给定义到一个独立的类中。
然后,让这多个类和这个独立的类产生一个关系,有了这个关系后,
这多个类就可以具备这个独立的类的功能。
为了实现这个效果,java就提供了一个技术:继承。
父亲:
4个儿子
继承怎么表示呢?继承的格式是什么样子的呢?
class Fu {}
class Zi extends Fu {
}
我们就回头修改我们的代码:
class Person {String name;int age;public Person(){}//getXxx()/setXxx()public void eat() {System.out.println("吃饭");}}class Student extends Person {public Student(){}}class Teacher extends Person {public Teacher(){}}
/*继承概述:把多个类中相同的内容给提取出来定义到一个类中。如何实现继承呢? Java提供了关键字:extends格式:class 子类名 extends 父类名 {}好处:A:提高了代码的复用性B:提高了代码的维护性C:让类与类之间产生了关系,是多态的前提类与类产生了关系,其实也是继承的一个弊端:类的耦合性增强了。开发的原则:低耦合,高内聚。耦合:类与类的关系内聚:就是自己完成某件事情的能力
*///使用继承前
/*
class Student {public void eat() {System.out.println("吃饭");}public void sleep() {System.out.println("睡觉");}
}class Teacher {public void eat() {System.out.println("吃饭");}public void sleep() {System.out.println("睡觉");}
}
*///使用继承后
class Person {public void eat() {System.out.println("吃饭");}public void sleep() {System.out.println("睡觉");}
}class Student extends Person {}class Teacher extends Person {}class ExtendsDemo {public static void main(String[] args) {Student s = new Student();s.eat();s.sleep();System.out.println("-------------");Teacher t = new Teacher();t.eat();t.sleep();}
}
l继承概述
•多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
•通过extends关键字可以实现类与类的继承
•class 子类名 extends 父类名 {}
•单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
•有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
继承的案例和继承的好处
l通过一个具体案例来演示代码
•案例1:学生类和老师。定义两个功能(吃饭,睡觉)
•案例2:加入人类后改进。
l继承的好处
•提高了代码的复用性
•多个类相同的成员可以放到同一个类中
•提高了代码的维护性
•如果功能的代码需要修改,修改一处即可
•让类与类之间产生了关系,是多态的前提
•其实这也是继承的一个弊端:类的耦合性很强
Java中继承的特点
lJava只支持单继承,不支持多继承。
•一个类只能有一个父类,不可以有多个父类。
•class SubDemo extends Demo{} //ok
•class SubDemo extends Demo1,Demo2...//error
lJava支持多层继承(继承体系)
•class A{}
•class B extends A{}
•class C extends B{}
/*Java中继承的特点:A:Java只支持单继承,不支持多继承。有些语言是支持多继承,格式:extends 类1,类2,...B:Java支持多层继承(继承体系)
*//*
class Father {}
class Mother {}
class Son exnteds Father {} //正确的
class Son extends Father,Mother {} // 错误的
*/class GrandFather {public void show() {System.out.println("我是爷爷");}
}class Father extends GrandFather {public void method(){System.out.println("我是老子");}
}class Son extends Father {}class ExtendsDemo2 {public static void main(String[] args) {Son s = new Son();s.method(); //使用父亲的s.show(); //使用爷爷的}
}
Java中继承的注意事项
l子类只能继承父类所有非私有的成员(成员方法和成员变量)
•其实这也体现了继承的另一个弊端:打破了封装性
l子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
l不要为了部分功能而去继承
l我们到底在什么时候使用继承呢?
•继承中类之间体现的是:”is a”的关系。
/*Java中继承的特点:A:Java只支持单继承,不支持多继承。有些语言是支持多继承,格式:extends 类1,类2,...B:Java支持多层继承(继承体系)
*//*
class Father {}
class Mother {}
class Son exnteds Father {} //正确的
class Son extends Father,Mother {} // 错误的
*/class GrandFather {public void show() {System.out.println("我是爷爷");}
}class Father extends GrandFather {public void method(){System.out.println("我是老子");}
}class Son extends Father {}class ExtendsDemo2 {public static void main(String[] args) {Son s = new Son();s.method(); //使用父亲的s.show(); //使用爷爷的}
}
/*继承的注意事项:A:子类只能继承父类所有非私有的成员(成员方法和成员变量)B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。C:不要为了部分功能而去继承class A {public void show1(){}public void show2(){}}class B {public void show2(){}public void show3(){}}//我们发现B类中出现了和A类一样的show2()方法,所以,我们就用继承来体现class B extends A {public void show3(){}}这样其实不好,因为这样你不但有了show2(),还多了show1()。有可能show1()不是你想要的。那么,我们什么时候考虑使用继承呢?继承其实体现的是一种关系:"is a"。PersonStudentTeacher水果苹果香蕉橘子采用假设法。如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
*/
class Father {private int num = 10;public int num2 = 20;//私有方法,子类不能继承private void method() {System.out.println(num);System.out.println(num2);}public void show() {System.out.println(num);System.out.println(num2);}
}class Son extends Father {public void function() {//num可以在Father中访问private//System.out.println(num); //子类不能继承父类的私有成员变量System.out.println(num2);}
}class ExtendsDemo3 {public static void main(String[] args) {// 创建对象Son s = new Son();//s.method(); //子类不能继承父类的私有成员方法s.show();s.function();}
}
/*类的组成:成员变量:构造方法:成员方法:而现在我们又讲解了继承,所以,我们就应该来考虑一下,类的组成部分的各自关系。继承中成员变量的关系:A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。B:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?在子类方法中访问一个变量的查找顺序:a:在子类方法的局部范围找,有就使用b:在子类的成员范围找,有就使用c:在父类的成员范围找,有就使用d:如果还找不到,就报错。
*/
class Father {public int num = 10;public void method() {int num = 50;}
}class Son extends Father {public int num2 = 20;public int num = 30;public void show() {int num = 40;System.out.println(num);System.out.println(num2);// 找不到符号System.out.println(num3);}
}class ExtendsDemo4 {public static void main(String[] args) {//创建对象Son s = new Son();s.show();}
}
/*继承的注意事项:A:子类只能继承父类所有非私有的成员(成员方法和成员变量)B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。C:不要为了部分功能而去继承class A {public void show1(){}public void show2(){}}class B {public void show2(){}public void show3(){}}//我们发现B类中出现了和A类一样的show2()方法,所以,我们就用继承来体现class B extends A {public void show3(){}}这样其实不好,因为这样你不但有了show2(),还多了show1()。有可能show1()不是你想要的。那么,我们什么时候考虑使用继承呢?继承其实体现的是一种关系:"is a"。PersonStudentTeacher水果苹果香蕉橘子采用假设法。如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
*/
class Father {private int num = 10;public int num2 = 20;//私有方法,子类不能继承private void method() {System.out.println(num);System.out.println(num2);}public void show() {System.out.println(num);System.out.println(num2);}
}class Son extends Father {public void function() {//num可以在Father中访问private//System.out.println(num); //子类不能继承父类的私有成员变量System.out.println(num2);}
}class ExtendsDemo3 {public static void main(String[] args) {// 创建对象Son s = new Son();//s.method(); //子类不能继承父类的私有成员方法s.show();s.function();}
}
super关键字
lsuper的用法和this很像
•this代表本类对应的引用。
•super代表父类存储空间的标识(可以理解为父类引用)
l用法(this和super均可如下使用)
l访问成员变量
lthis.成员变量 super.成员变量
l访问构造方法(子父类的构造方法问题讲)
lthis(…) super(…)
l访问成员方法(子父类的成员方法问题讲)
lthis.成员方法() super.成员方法()
/*问题是:我不仅仅要输出局部范围的num,还要输出本类成员范围的num。怎么办呢?我还想要输出父类成员范围的num。怎么办呢?如果有一个东西和this相似,但是可以直接访问父类的数据就好了。恭喜你,这个关键字是存在的:super。this和super的区别?分别是什么呢?this代表本类对应的引用。super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)怎么用呢?A:调用成员变量this.成员变量 调用本类的成员变量super.成员变量 调用父类的成员变量B:调用构造方法this(...) 调用本类的构造方法super(...) 调用父类的构造方法C:调用成员方法this.成员方法 调用本类的成员方法super.成员方法 调用父类的成员方法
*/
class Father {public int num = 10;
}class Son extends Father {public int num = 20;public void show() {int num = 30;System.out.println(num);System.out.println(this.num);System.out.println(super.num);}
}class ExtendsDemo5 {public static void main(String[] args) {Son s = new Son();s.show();}
}
/*继承中构造方法的关系A:子类中所有的构造方法默认都会访问父类中空参数的构造方法B:为什么呢?因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。注意:子类每一个构造方法的第一条语句默认都是:super();
*/
class Father {int age;public Father() {System.out.println("Father的无参构造方法");}public Father(String name) {System.out.println("Father的带参构造方法");}
}class Son extends Father {public Son() {//super();System.out.println("Son的无参构造方法");}public Son(String name) {//super();System.out.println("Son的带参构造方法");}
} class ExtendsDemo6 {public static void main(String[] args) {//创建对象Son s = new Son();System.out.println("------------");Son s2 = new Son("林青霞");}
}
/*如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?报错。如何解决呢? A:在父类中加一个无参构造方法B:通过使用super关键字去显示的调用父类的带参构造方法C:子类通过this去调用本类的其他构造方法子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。注意事项:this(...)或者super(...)必须出现在第一条语句上。如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
*/
class Father {/*public Father() {System.out.println("Father的无参构造方法");}*/public Father(String name) {System.out.println("Father的带参构造方法");}
}class Son extends Father {public Son() {super("随便给");System.out.println("Son的无参构造方法");//super("随便给");}public Son(String name) {//super("随便给");this();System.out.println("Son的带参构造方法");}
}class ExtendsDemo7 {public static void main(String[] args) {Son s = new Son();System.out.println("----------------");Son ss = new Son("林青霞");}
}
this() ==== Son()====间接的访问
继承中成员方法的关系
l方法重写概述
•子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。
•使用特点:
•如果方法名不同,就调用对应的方法
•如果方法名相同,最终使用的是子类自己的
l方法重写的应用:
•当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
/*继承中成员方法的关系:A:子类中的方法和父类中的方法声明不一样,这个太简单。B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢?通过子类对象调用方法:a:先找子类中,看有没有这个方法,有就使用b:再看父类中,有没有这个方法,有就使用c:如果没有就报错。
*/
class Father {public void show() {System.out.println("show Father");}
}class Son extends Father {public void method() {System.out.println("method Son");}public void show() {System.out.println("show Son");}
}class ExtendsDemo8 {public static void main(String[] args) {//创建对象Son s = new Son();s.show();s.method();//s.fucntion(); //找不到符号}
}
/*方法重写:子类中出现了和父类中方法声明一模一样的方法。方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值无关。子类对象调用方法的时候:先找子类本身,再找父类。方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。案例:A:定义一个手机类。B:通过研究,我发明了一个新手机,这个手机的作用是在打完电话后,可以听天气预报。按照我们基本的设计,我们把代码给写出来了。但是呢?我们又发现新手机应该是手机,所以,它应该继承自手机。其实这个时候的设计,并不是最好的。因为手机打电话功能,是手机本身就具备的最基本的功能。所以,我的新手机是不用在提供这个功能的。但是,这个时候,打电话功能就没有了。这个不好。最终,还是加上这个功能。由于它继承了手机类,所以,我们就直接使用父类的功能即可。那么,如何使用父类的功能呢?通过super关键字调用
*/
class Phone {public void call(String name) {System.out.println("给"+name+"打电话");}
}class NewPhone extends Phone {public void call(String name) {//System.out.println("给"+name+"打电话");super.call(name);System.out.println("可以听天气预报了");}
}class ExtendsDemo9 {public static void main(String[] args) {NewPhone np = new NewPhone();np.call("林青霞");}
}
/*看程序写结果:A:成员变量的问题int x = 10; //成员变量是基本类型Student s = new Student(); //成员变量是引用类型B:一个类的初始化过程成员变量的初始化默认初始化显示初始化构造方法初始化C:子父类的初始化(分层初始化)先进行父类初始化,然后进行子类初始化。结果:YXYZ问题:虽然子类中构造方法默认有一个super()初始化的时候,不是按照那个顺序进行的。而是按照分层初始化进行的。它仅仅表示要先初始化父类数据,再初始化子类数据。
*/
class X {Y b = new Y();X() {System.out.print("X");}
}class Y {Y() {System.out.print("Y");}
}public class Z extends X {Y y = new Y();Z() {//superSystem.out.print("Z");}public static void main(String[] args) {new Z(); }
}
l方法重写的注意事项
•父类中私有方法不能被重写
•子类重写父类方法时,访问权限不能更低
•父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解)
总结
1:如何制作帮助文档(了解)
(1)写一个类
(2)加入文档注释
(3)通过javadoc工具生成即可
javadoc -d 目录 -author -version ArrayTool.java
2:通过JDK提供的API学习了Math类(掌握)
(1)API(Application Programming Interface)
应用程序编程接口(帮助文档)
(2)如何使用呢?
请参照
day08\code\02_如何使用JDK提供的帮助文档\如何使用帮助文档.txt
(3)Math类
A:是针对数学进行操作的类
B:没有构造方法,因为它的成员都是静态的
C:产生随机数
public static double random(): [0.0,1.0)
D:如何产生一个1-100之间的随机数
int number = (int)(Math.random()*100)+1;
E:猜数字小游戏
3:代码块(理解)
(1)用{}括起来的代码。
(2)分类:
A:局部代码块
用于限定变量的生命周期,及早释放,提高内存利用率。
B:构造代码块
把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。
C:静态代码块
对类的数据进行初始化,仅仅只执行一次。
(3)静态代码块,构造代码块,构造方法的顺序问题?
静态代码块 > 构造代码块 > 构造方法
4:继承(掌握)
(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
这多个类就具备了这些内容。这个关系叫继承。
(2)Java中如何表示继承呢?格式是什么呢?
A:用关键字extends表示
B:格式:
class 子类名 extends 父类名 {}
(3)继承的好处:
A:提高了代码的复用性
B:提高了代码的维护性
C:让类与类产生了一个关系,是多态的前提
(4)继承的弊端:
A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
原则:低耦合,高内聚。
耦合:类与类的关系
内聚:自己完成某件事情的能力
B:打破了封装性
(5)Java中继承的特点
A:Java中类只支持单继承
B:Java中可以多层(重)继承(继承体系)
(6)继承的注意事项:
A:子类不能继承父类的私有成员
B:子类不能继承父类的构造方法,但是可以通过super去访问
C:不要为了部分功能而去继承
(7)什么时候使用继承呢?
A:继承体现的是:is a的关系。
B:采用假设法
(8)Java继承中的成员关系
A:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序:
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
B:构造方法
a:子类的构造方法默认会去访问父类的无参构造方法
是为了子类访问父类数据的初始化
b:父类中如果没有无参构造方法,怎么办?
子类通过super去明确调用带参构造
子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
让父类提供无参构造
C:成员方法
a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
(9)两个面试题:
A:Override和Overload的区别?Overload是否可以改变返回值类型?
B:this和super的区别和各自的作用?
(10)数据初始化的面试题
A:一个类的初始化过程
B:子父类的构造执行过程
C:分层初始化
(11)案例:
A:学生和老师案例
继承前
继承后
B:猫狗案例的分析和实现
传智播客Java学习之类的继承相关推荐
- java就业班学什么呀_传智播客JAVA就业班学习心得
传智播客JAVA就业班学习心得 4月26日CVS---4月27日UML 连续两天状态很是不好,上课总是不能够集中精神.不知为什么听这两天课的时候精神很涣散,也不知道自己在想什么,一整天的课,似听非听的 ...
- 参加口碑最好的广州传智播客Java就业培训班吧
参加口碑最好的广州传智播客Java就业培训班吧 广州传智播客Java培训课程与时俱进性与科学专业性,为广大学子省去了后顾之忧,其中JAVAEE+android3G/4G培训课程更是以科学的体系为支撑, ...
- 成都传智播客Java培训
成都传智播客Java培训,严格按照北京传智播客的教育模式,为西南IT行业培养了许多优秀的软件开发工程师. 我们有专为0基础.或者基础不够硬的学员开设的Java基础与加强班,让你轻轻松松跨进Java的世 ...
- 广州Java培训机构之广州传智播客Java课程
广州Java培训机构之广州传智播客Java课程 广州传智播客Java课程,全国领先的Java课程,一群敢于创新,勇于创新的精英老师.广州传智播客Java学科,从开设学科以来,秉承着张孝祥老师 ...
- 传智播客JAVA培训20100524SPRING SECURITY
传智播客JAVA培训20100524SPRING SECURITY 这两天反反复复的看了佟刚老师的教育办公管理系统的项目视频,真是感觉到该老师真是强大,讲的项目非常有技术含量,虽然到现在我都还是半知半 ...
- 传智播客JAVA培训2010-4-29Lucene总结
传智播客JAVA培训2010-4-29Lucene总结 今天心情不错,北京的天终于露出了太阳那花儿一般的脸蛋儿,心情也不由因此而生出喜悦,人总是会受环境的影响,下午回来新闻中我看到广东那边发生的事,我 ...
- 传智播客java测试题_传智播客Java基础综合测试题
传智播客Java基础综合测试题 传智播客Java基础综合测试题 第一关 1.动手完成 Java 开发包的安装,并设置环境变量 Path . 2.编写一个程序,要求程序运行后在屏幕上输出: ****** ...
- 传智java测试题答案_传智播客Java基础第一阶段习题
关于java程序员面试的经典题目 传智播客Java基础第一阶段习题 一.单项选择题 1.Java源文件和编译后的文件扩展名分别为( ) A..class和 .java B..java和 .class ...
- 成都传智播客java培训中心
"21世纪什么最重要.人才!" "IT世界里,人才是最宝贵的财富!" 成都传智播客java培训中心,自成立以来!以其雄厚的师资.真实的项目推动,帮助广大的学子走 ...
- 传智播客java就业班入学测试题(自测+答案)
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 传智播客java就业班入学测试题 ...
最新文章
- IE6动态插入option
- junit可执行但控制层无法执行_Junit测试时ContextLoader.getCurrentWebApplicationContext()返回空值...
- Window.ActiveXObject的用法 以及如何判断浏览器的类型
- 芥子空间破解游戏的加固保护案例
- 惠普打印机显示服务器脱机,打印机脱机解决办法 HP打印机出现脱机故障的解决办法...
- LeetCode_1905_连续子数组的最大和
- 入门人工智能历程,学习西瓜书的体验心得
- 上海市新生婴儿户口登记(出生申报)
- NPDP产品经理证书在中国有用吗?
- 【综合笔试题】难度 3/5,挺有意思的一道题(既可图论,也可贪心)
- 我是如何设计一个包办所有对企政策的城市平台
- Nginx学习(四)
- python爬虫之:IP代理池开源项目讲解
- 找2021考研资料?这些超强资源网站必须知道!
- ProcessDefinition是干这个用的
- 北工商计算机学校,北京工商大学计算机学院
- android模拟器访问本地网站
- vnc远程桌面,六款好用又免费的vnc远程桌面软件
- 2021-11-16 以太网
- Oracle数据库安全-版本补丁版本计划(202207更新)
热门文章
- rest sso 和_SSO企业单点登录系统——CAS REST认证方式
- delphi 剪切板变量_delphi读写剪贴板
- Linux下一种高效多定时器实现,Linux下一种高效多定时器实现
- mysql指定库执行sql语句_对多个mysql的一部分库进行执行sql语句
- github项目地址在哪里看_拍张照片求解数独,计算机如何从图中看懂题目,这个GitHub热榜项目告诉你...
- wiki.openwrt.org无法打开的解决办法
- 机器人到底会不会有情感?
- ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
- Ubuntu下hadoop2.4搭建集群(单机模式)
- Powershell与运维之服务器管理(一) 利用Powershell管理HP服务器