- 词 目
- 继承
- 拼 音
- jì chéng
- 基本解释
- 依法承受等
- 词 性
- 动词
- 用 法
- 谓语等
- 组 词
- ~权,~人等
-
继承
2018-07-08 12:05:551.什么是继承?(在代码中,在原有类的基础上<属性和方法>,构造一个新的类。) 继承需要符合的关系:is-a的关系;父类更通用更抽象,子类更特殊更具体(因为父类相对于子类而言,父类中有的方法,...1.什么是继承?(在代码中,在原有类的基础上<属性和方法>,构造一个新的类。)
继承需要符合的关系:is-a的关系;父类更通用更抽象,子类更特殊更具体(因为父类相对于子类而言,父类中有的方法,子类全都有;而子类有的属性和方法父类未必有,所以子
类更具体,父类更抽象)。继承背后的思想就是基于已经存在的类来构建新类,当从已存在的类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求
(新类称之为子类,被扩建的类称之为父类)。在java当中,除了Object类之外,所有的类都是子类,且都有唯一的一个父类。继承在OOP中不可或缺,创建一个类时,总是在继承
(因为顶层是Object类,所以当你创建一个类时,都在间接或直接的继承了Object父类,即你创建的类永远为子类)
(1)类之间的关系
is-a:继承关系
Has-a:组合体现(如方向盘对象,轮子对象...组合成了汽车这个对象)
Like-a:实现接口体现(像...关系,具备...能力的关系)
(2)继承的意义:代码重用,体现不同抽象层次,为多态做铺垫。
(3)继承的特点:子类继承了父类的成员(即属性和方法),虽然父类中私有的属性和方法也被继承了,但是访问不到。
(4)继承的优点:代码重用(父类中的属性和方法可为子类使用);父类字段和方法可用于子类;从抽象到具体形成类的继承体系(也就是具有层次结构);可轻松自定义子类(也就是
一个类可以构建多个子类)
(5)在java当中,用extends关键字来表示一个类继承了一个类。
2.super关键字
(1)super关键字的特点:
super关键字和this关键字的特点类似,super关键字代表的是父类对象的引用(保存的是父类引用对象的内存地址),this关键字代表的是当前对象的引用(保存的是当前对象
的内存地址);当子父类的成员出现同名的时候,可以通过super关键字来区分。子类的构造方法中,通过super关键字来调用父类的构造方法,且必须是子类构造方法中的第一条语句。
当我们产生子类对象的时候,肯定先要去调用父类的构造方法来产生父类的对象,再产生子类对象。
(2)方法重写(Override,与方法重载没有关系)
方法重写是指子类可以根据需要对从父类继承来的方法进行改写,是多态机制的前奏。
(3)方法重写的注意点:
重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值;重写方法不能使用比被重写方法更严格的访问权限,父类中的私有方法不能被重写。
(4)final关键字的特点
final可以修饰变量、方法、类;final修饰的变量是一个常量,一旦赋了值就不能在修改了。常量一般都和static关键字配合使用。final修饰的类代表此类不能被继承,
final修饰的方法代表此方法不能被重写。被final修饰的对象,是引用不可变,对象的内容是可变的。
3.Object类中常见的方法
java中所有的子类都间接或者直接的继承自java.lang.Object类,可以说Object是java中所有类的祖先类即根类。java中任何类都继承了Object类中的方法,主要有:
toString():返回该对象的字符串表示
equals():指示其他对象是否与此对象“相等”
hashCode():返回该对象的哈希码值
clone():创建并返回此对象的一个副本
getClass():返回此Object的运行时类
finalize():是由垃圾回收器在确定某一个对象没有被引用时,删除清理之前,这个对象调用的。
String toString():类名@哈希码值
返回该对象的字符串描述性信息,默认输出的格式是:“类名[字段值,字段值...];”只要对象与一个字符串通过“+”连接,系统就会自动调用toString()以获得对象的字符串描述。
可以根据用户的需要对其进行重写。
boolean equals():比较两个引用变量是否指向同一个对象
Object类原始功能是实现判断两个对象是否具有相同的引用,要求判断两个对象状态的相等性;可以根据需要对该方法进行重写。
public class Person {
public static void main(String[] args) {
Student stu1 = new Student("Jack", 20);
System.out.println(stu1.toString());
Student stu2 = new Student("Jack", 20);
System.out.println(stu1.equals(stu2));
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:"+ name + "年龄:" + age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
Student stu = (Student)obj;
if (this.age != stu.age) {
return false;
}
if (this.name == null) {
if (stu.name != null) {
return false;
}
} else if (!this.name.equals(stu.name)) {
return false;
}
return true;
}
} -
IntelliJ IDEA 中如何查看一个类的所有继承关系(当前类的所有继承关系图)
2016-10-19 10:50:50这个继承,不仅仅是一级的继承关系,包括好几层的继承。父类的父类的父类。直到最后。 可以很清楚明了的了解一个类的实现关系。diagram 英[ˈdaɪəgræm] 美[ˈdaɪəˌɡræm] n. 图表; 示意图; 图解; [数] 线图;....IntelliJ IDEA使用教程 (总目录篇)
在 IntelliJ IDEA 中这个查看一个类也就是当前类的所有继承关系,包括实现的所有的接口和继承的类,
这个继承,不仅仅是一级的继承关系,包括好几层的继承。父类的父类的父类。直到最后。
可以很清楚明了的了解一个类的实现关系。
diagram 英[ˈdaɪəgræm] 美[ˈdaɪəˌɡræm]
n. 图表; 示意图; 图解; [数] 线图;
vt. 图解; 用图表示;下面看这个编辑器怎么以图解的形式,查看这种继承关系。
(上面的是查看的Java源码的类的所有继承关系,最下面的这个是在查看spring项目里面的一个类的继承关系的时候,可能会有spring关系图,这个spring关系太复杂了,简直跟蜘蛛网一样,还是就看看各个类的继承图就可以啦。)
更新:这个地方是有放大镜功能哦。我也是意外发现的,具体看图。
20170508,追加;
看了楼下的评论,还真的有个uml插件,然后,就看下面的截图,要是你们是社区版的,看看下载了这个插件之后,能不能用?
2017/08/01追加
上面示范的是如何向上看----看一个类的继承关系;
下面再看看,怎么向下看,-----看一个类的子类实现关系。
先看下map接口的实现类,哇赛赛,600多个。
这个so far。我上面截图理解的有点问题,不是没找到,是暂时没有继续扩展,因为jdk也是一直在发展的,所以,这个map接口的实现类,以后只会多,不会少的。所以,他这个地方的so far ,就目前为止,也许再过些年,六千个也是可能的。
再看个少点的。
这个是我们自己写的一个类,他有四个类继承了这个类。这个少。
那么快捷键是啥呢?
我这个就是告诉你,怎么在你的电脑上,找到你自己对应的快捷键。我这是Ctrl + T。不知道你那是啥。
我写完文章,给自己点个赞,不过分吧,
不过分,那我可就点啦啊。
我先点为敬,你们随意。大家随意。不要客气。。。 -
7.1.4继承
2020-02-03 20:52:03继承 生活中的继承 类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: class 父类 { } class 子类 extends 父类 { } 为什么需要继承 接下来我们通过...继承
生活中的继承
类的继承格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 { } class 子类 extends 父类 { }
为什么需要继承
接下来我们通过实例来说明这个需求。
开发动物类,其中动物分别为企鹅以及老鼠,要求如下:
- 企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
- 老鼠:属性(姓名,id),方法(吃,睡,自我介绍)
public class AA { public static void main(String[] args) { dog TOM = new dog("TOM");//新建dog对象 } } class dog extends Animal//继承Animal类 相当于把Animal类的东西送给dog { public dog(String name) //构造函数 { this.name=name;//继承Animal的name System.out.print(this.name); eat("食物");//调用继承函数eat sleep();//调用继承函数sleep } } class Animal //动物 包含 吃 和 睡 { public String name; /睡睡睡 public void sleep() { System.out.print("sleep now"); } /吃吃吃 public void eat(String something) { System.out.print(something); } }
继承类型
需要注意的是 Java 不支持多继承,但支持多重继承。
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类
extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
public class Animal { private String name; private int id; public Animal(String myName, String myid) { //初始化属性值 } public void eat() { //吃东西方法的具体实现 } public void sleep() { //睡觉方法的具体实现 } } public class Penguin extends Animal{ }
implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
public interface A { public void eat(); public void sleep(); } public interface B { public void show(); } public class C implements A,B { }
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
class Animal { void eat() { System.out.println("animal : eat"); } } class Dog extends Animal { void eat() { System.out.println("dog : eat"); } void eatTest() { this.eat(); // this 调用自己的方法 super.eat(); // super 调用父类方法 } } public class Test { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eatTest(); } }
final关键字
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
-
声明类:
final class 类名 {//类体}
-
声明方法:
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
注:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
public class AA extends Animal { public static void main(String[] args) { new AA("继承构造函数"); } public AA(String A) { super(A); } } class Animal //动物 包含 吃 和 睡 { public Animal(String A) { System.out.print(A); } }
-
考虑用Mix-in组件代替多继承
2020-10-28 11:24:25Python是面向对象的编程语言,它提供了一些内置的编程机制,使得开发者可以适当地实现多继承。但是,我们仍然应该尽量避开多继承。 若一定要利用多继承所带来的便利及封装性,那就考虑编写min-in类。min-in是一种...Python是面向对象的编程语言,它提供了一些内置的编程机制,使得开发者可以适当地实现多继承。但是,我们仍然应该尽量避开多继承。
若一定要利用多继承所带来的便利及封装性,那就考虑编写min-in类。min-in是一种小型的类,它只定义了其他类可能需要提供的一套附加方法,而不定义自己的属性,此外,它也不要求使用者调用自己的__init__构造器。
min-in的最大优势在于,使用者可以随时安插这些通用的功能,并且在必要时覆写它们,多个min-in直接也可以相互组合。有了这样的min-in之后,我们只需要编写极其少量的代码,就可以通过继承体系,轻松地创建出相关工具类。
要点:
1.能用min-in组件实现的效果,就不要用多继承来做。
2.将各功能实现为可插拔的min-in组件,然后继承之。
3.将简单的行为封装到min-in组件里,然后就可以用多个min-in组合出复杂的行为。
例如,我们需要把Python实例对象以字典形式输出,以便将其序列化,我们不妨把这个功能写成通用代码,以供其他类使用。
class ToDictMixin(object): def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, instance_dict): output = {} for key, value in instance_dict.items(): output[key] = self._traverse(key, value) return output def _traverse(self, key, value): if isinstance(value, ToDictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, i) for i in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value
再如,我们可以编写一个min-in,它能为任意类提供通用的JSON序列化功能,我们可以假设:继承了min-in的那个类,会提供名为to_dict的方法。
class JsonMixin(object): @classmethod def from_json(cls, data): kwargs = json.loads(data) return cls(**kwargs) def to_json(self): return json.dumps(self.to_dict())
然后,我们定义一个测试类,同时继承上述两个min-in,以达到扩展功能的作用。
class Person(ToDictMixin, JsonMixin): def __init__(self, name, age, address, list1, dict1): self.name = name self.age = age self.address = address self.list1 = list1 self.dict1 = dict1 def introduce(self): print(f'{self.name} {self.age} {self.address}')
测试运行结果:
if __name__ == '__main__': # 1.测试ToDictMixin person = Person('zhangsan', 18, 'Shenzhen', [1, 2, 3], {'username': 'admin', 'password': '123456'}) print(person.to_dict()) # 2.测试JsonMixin json_str = '{"name": "zhangsan", "age": 18, "address": "Shenzhen", "list1": [1, 2, 3], "dict1": {"username": "admin", "password": "123456"}}' person = Person.from_json(data=json_str) json_str = person.to_json() print(json_str)
运行结果:
运行结果显示,已成功为Person类通过min-in扩展的形式,为其添加了新功能 :将Python实例对象以字典形式输出、将Python实例对象以JSON字符串形式输出。
-
-
C++ 继承(2): 多重继承, 多继承, 虚继承(virtual)
2019-03-20 22:59:49C++远征之继承篇 视频教程 笔记 方便自己查阅和复习,温故而知新。 接着C++ 继承(1): 继承方式(public, protected, private), 继承中的特殊关系(隐藏 , is-a) 继续做笔记 目录 4 多继承与多重继承 4.1 多重... -
Java 继承
2019-05-07 11:12:43java继承的概念 Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为, 并能扩展新的能力, 继承使用的是extends 类的继承格式 class 父类 { } class ... -
C++虚继承实现原理——解决菱形继承问题
2018-11-11 14:36:14首先给出以下继承关系,以便描述虚继承原理: class AAA { public: int age; }; class BBB:virtual public AAA//变为虚继承,A变为虚基类 { }; class CCC:virtual public AAA { }; class DDD:public BBB, ... -
Kotlin 继承
2020-08-17 11:32:24文章目录Kotlin 继承构造函数子类有主构造函数子类没有主构造函数实例重写属性重写END Kotlin 继承 Kotlin 中所有类都继承该 Any 类,它是所有类的超类,对于没有超类型声明的类是默认超类: class Example // 从 ... -
啊?密封类可以被继承了 —— 爷青结(JDK15新特性)
2020-10-24 12:48:32密封类从刚开始学就从各种途径了解到不能被继承,新版本的密封类如果想要被继承需要用permits指定被继承的类 同时,被继承的类需要用final,sealed或者non-sealed修饰 正常的一个代码思路 public class Person { }... -
三种继承的方法:public 继承/private继承/protected继承详解及区别
2018-08-27 23:59:121 三种继承方式 (1) 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。 (2) 私有... -
java继承(implements与extends)总结
2018-04-23 21:40:20使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔) 还有几点需要注意: (1)接口可以被多重实现(implements),抽象类... -
C++公有继承,保护继承,私有继承的区别
2018-08-21 15:34:321.公有继承–public 公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象只能访问派生类的公有成员(包括继承的... -
Python中类的继承、多层继承和多继承
2019-06-05 15:03:45Python中类的继承、多层继承和多继承 Python中,一个类可以通过继承的方式来获得父类中的非私有属性和非私有方法。 一、继承、重写、和调用重写的父类方法 继承的语法为在类名后的小括号()中写入要继承的父类名,... -
菱形继承与虚继承
2018-08-07 11:23:07菱形继承 先介绍一下单继承和多继承 单继承 多继承 菱形继承 菱形继承是单继承和多继承的集合 ... -
C++ 深入理解 虚继承、多重继承和直接继承
2017-12-02 18:14:48C++ 深入理解 虚继承、多重继承和直接继承 -
继承——菱形继承
2019-01-18 20:34:07一、菱形继承是什么? 一个派生类有多个基类,多个基类又由同一个类派生,用下列代码来解释 class A { public: int _a; }; class B : public A { public: int _b; }; class C : public A { public: int _c; ... -
java单继承和多继承
2019-10-04 19:55:27java单继承和多继承 单线程:一个子类只能继承自一个父类 多线程:一个子类可以继承自多个父类 java继承关键字extend和implement,Java所有子类都继承自 java.lang.Object,即java.lang.Object是Java的祖先类,当一... -
公有继承,私有继承,保护继承的区别
2018-08-24 17:50:36一个子类继承父类时,可按照public、private和protected方式继承父类,每种继承方式的区别如下: 1) public继承方式 基类中所有public成员在派生类中为public属性; 基类中所有protected成员在派生类中为... -
C++多继承多重继承
2019-03-05 21:58:19多重继承:一个基类有一个派生类,这个派生类又有一个派生类 多继承:一个派生类有多个基类 下面我们看一个多重继承的例子 #include <iostream> #include <stdlib.h> #include ... -
Python:类的继承,调用父类的属性和方法基础详解
2018-12-30 11:35:01备注:这里省略了关于继承含义的解释,直接上代码了,更直观点 子类:Son类 父类:Father类 以下案例均表示Son类继承父类的一些属性和初始化参数构造等。 5个模块: (1):直接调用父类属性方法; (2):重写... -
C++多继承与虚继承
2018-12-06 08:57:08目录 多继承与虚继承以及存在的问题 例子 多继承与虚继承以及存在的问题 虚继承 ...有了多继承,虚继承才会有意义 ...如果这样继承B,C虚继承了A,virtual public,然后D继承B,C 通常的理... -
JS继承之组合继承
2018-09-05 16:39:17前面介绍了原型链继承以及构造函数继承,它们都有各自的优缺点 特点 优点 缺点 原型链继承 子类原型prototype对父类实例化来实现 子类不仅仅可以访问父类原型上的属性和方法,同样也可以访问从父类... -
C++之继承(多重继承+多继承+虚继承+虚析构函数+重定义)
2017-03-04 13:07:54多重继承和多继承 这个我们来讲讲这两个的概念问题,一字之差,千差万别。 多重继承,比如有三个类,人类-士兵类-步兵类,三个依次继承,这样的继承称为多重继承。class Person {};class Soldier :public Person {... -
JS继承之寄生继承
2018-09-05 16:58:57JavaScript继承还有一种继承模式——寄生继承。 举个例子: function object(o) { function F() {}; F.prototype = o; return new F(); } var twoD = { name: '2D shape', dimensions: 2 } function triangle... -
JS继承
2018-11-11 11:05:41最近在面试中被问到js的继承,当时回答的不太好,所以今天特别总结一下。 我们先来看一个基于原型链的继承 //父类 function Person(){} //子类 function Student(){} //继承 Student.prototype = new Person... -
C++单继承,多重继承,虚拟继承与内存布局
2019-03-04 22:51:57多继承比单继承更复杂,引入了歧义的问题,以及虚继承的必要性; 虚继承在大小,速度,初始化,复制的复杂性上有不小的代价,当虚基类中没有数据时还是比较合适的; 多继承有时也是有用的。典型的场景是:public继承... -
python 多继承与继承原理及多继承中super本质
2019-01-15 21:27:28一个子类可以继承多个父类,就是多继承,并且拥有所有父类的属性和方法。 例如 孩子会继承自己的父亲和母亲的特征。 目录 (一)语法 (二)多继承注意事项 (三)钻石继承 (四)多继承中super本质 (一)... -
浅谈C++类中的三大继承方式:公有继承、私有继承、保护继承
2018-05-30 22:14:00派生类继承了基类的全部数据成员和除了构造函数、析构函数之外的全部函数成员,但是,这些成员的访问属性在派生过程中是可以...类的继承方式有:公有继承、私有继承、保护继承当类的继承方式为公有继承时:基类的p...
-
【数据分析-随到随学】Python数据获取
-
SQL Server 2016 高可用灾备技术合集
-
Jenkins的凭证管理
-
国土空间规划形势下的村庄规划-南靖县船场镇集星村(2019-3035).pdf
-
thinkphp5.1博客后台实战视频
-
Redis笔记
-
环评考试还会继续使用报名承诺制吗?
-
c++ STL阐述了各种查找算法的异同以及使用他们的时机
-
git 入门
-
IEC104协议详解
-
C++学习(一九四)QT5.15以后不再提供离线安装版
-
【数据分析-随到随学】数据可视化
-
【数据分析-随到随学】Python语法强化与数据处理
-
linux服务器下执行matlab带参数的函数(.m文件)
-
jvisualvm安装Visual GC插件
-
Python入门到项目直通车
-
excel批量生成word.rar
-
春节灯笼Html代码实现+点击页面出现文字
-
三维地图GIS大数据可视化
-
全国各省js文件.zip