面向对象_05【类的继承:extends、重写父类】
类的继承:现有类的基础上构建一个新的类,构建出来的类被称作子类,子类可继承父类的属性和方法。
什么时候定义继承?
当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种==>xxx extends yyy
继承好处:
1,提高代码复用性
2,让类与类之间产生关系,给多态提供前提
单继承:一个子类只能有一个直接父类。
多继承:一个子类可以有多个直接父类(Java中不允许,进行改良)
==>不直接继承,因为多个父类中有相同成员,会产生调用的不确定性
在Java是通过“多实现”的方式来体现
继承的需注意的地方:
1,类只支持单继承,不允许多重继承,但对C++中的多继承机制进行改良。一个子类只能有一个直接父类,如下是错的继承方式
class A{}
class B{}
class C extends A,B{}
2,多个子类可继承一个父类
class A{}
class B extends A{}
class C extends A{}
3,多层继承类(就会出现继承体系)
==>当使用一个继承体系时:
1,查看该体系中的顶层类,了解该体系的基本功能
2,创建体系中的最子类对象,完成功能的使用
class A{}
class B extends A{} //类B继承A,B是A的子类
class C extends B{} //类C继承B,C是B的子类,同是也是A的子类
4,Java中,子类父类只是相对的概念,一个类是父类的同时,也可以是另一个类的子类。如3,:B是C的父类,同时也是A的子类
Example:
//继承的简单实例 package new_Object; //定义Person类 class Person_09{ //定义共有的属性 String name; int num; //定义打印方法 public void printf(){ System.out.println(name+"\t"+num); } } //学生类 class Student_1 extends/*继承*/ Person_09{ /** String name; int num; public void speak(){ System.out.println(name+"\t"+num); }*/ } //工人类 class Work extends Person_09{ /** String name; int num; public void speak(){ System.out.println(name+"\t"+num); }*/ } public class Extends_01 { public static void main(String[] args) { Student_1 stu=new Student_1(); stu.name="张三"; stu.num=2015112401; stu.printf(); Student_1 work=new Student_1(); work.name="李四"; work.num=1001; work.printf(); } }
继承的误区:
class DemoA{
void speak1(){}
void speak2(){}
}
class DemoB extends DemoB{
void speak1(){}
void speak3(){}
}
改良(向上抽取继承)==v
class Demo{
void speak1(){}
}
class DemoA{
//void speak1(){}
void speak2(){}
}
class DemoB extends Demo{
//void speak1(){}
void speak3(){}
}
重写父类:继承关系中,子类自动继承父类中定义的方法,有时需要在子类需要对继承方法改写。
注:在子类中重写的方法需要和父类被重写的方法具有相同的方法名,参数列表以及返回值类型
//重写父类 package new_Object; class Animal_02{ String name; //定义总的动物叫法 public void shout(){ System.out.println("种类"+" "+name); } } class Dog_02 extends Animal_02{ //单独定义狗的叫法 public void shout(){ System.out.println(name+" "+"动物发出的叫声:旺旺"); } } //定义其他动物类 class Horse_02 extends Animal_02{} class Bird_02 extends Animal_02{} public class Example02_Extends { public static void main(String[] args) { Dog_02 p1=new Dog_02(); p1.name="小狗"; p1.shout();/*调用的是子类的shout*/ //以下调用时父类的shout Horse_02 p2=new Horse_02(); p2.name="马"; p2.shout(); Bird_02 p3=new Bird_02(); p3.name="鸟"; p3.shout(); } }
最新文章
- flask表单提交的两种方式
- Sprint.Net 笔记
- I.MX6 console 跳过 login
- 跨frame操作dom元素
- HTML 中<;style>;中<;/style>;里面<;!-- -->;标签是干嘛的
- Java判断当前用户数及当前登录用户数工具类-session原理
- Vimperator技巧
- Python GUI - Tkinter tkMessageBox
- linux下配置Tomcat开机启动
- java专业术语
- Android 加载GIF图最佳实践
- Linux kernel的中断子系统之(四):High level irq event handler
- springboot学习随笔(二):简单的HelloWorld
- c# async和await 用法(阻塞与不阻塞)
- java学习笔记(十):scanner输入
- (10)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot+Identity Server
- mybatis oracle -批量插入,存在则更新
- JSP页面java代码报错:Purgoods cannot be resolved to a type
- 《在kali上完成gdb调试》
- apicloud开发笔记
热门文章
- 【转载】Centos7 中使用Supervisor守护进程
- TLD算法原理--学习理解之(二)
- [小程序开发] 微信小程序audio音频播放组件+api_wx.createAudioContext
- 一个vue项目的简单分享
- Centos环境下搭建Asp.NET Core环境和安装Jexus
- Mysql导入大文件报错(MySQL server has gone away(error 2006))
- python递归查找文件目录
- 【Html5】-- 塔台管制
- 深入理解 react-router 路由系统
- linux(七)之linux系统中查找文件