- 浏览: 531538 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (377)
- J2EE (61)
- ORACLE (36)
- JS (15)
- EXT (0)
- win7 (12)
- TOMCAT (10)
- game (1)
- ie (5)
- etc (8)
- ibatis (3)
- ORACLE 客户端 (1)
- bat (3)
- 健康 (127)
- baby (4)
- html (12)
- myeclipse (16)
- 射手 字幕默认下载 位置 (1)
- office (0)
- car (2)
- xxx (1)
- python简介 (1)
- FusionCharts (1)
- dorado (4)
- english (3)
- weblogic (3)
- request/servlet (3)
- wsdl (1)
- offie2010 visio2010 下载 (1)
- nexus5 (0)
- chrome (3)
- ssi (2)
- 安卓 (3)
- nexus ipad (1)
- mysql (4)
- json (3)
- struts (6)
- datagrid (1)
- highcharts (1)
- tools (2)
- tool (1)
- spring3 (1)
- jedit (1)
- java (4)
- windows (1)
- easyui (2)
- 液晶显示器色温 (1)
- mybatis (1)
- where (1)
- sublime (1)
- spring4 (3)
最新评论
-
spring_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
java 调用WebService服务接口 -
chenzheng8975:
阅
人生三大陷阱 -
ygbb007:
直接OD就能破解的
myBase Desktop 6.0 破解方法 -
lanlansnss:
直接删除nyfedit.ini文件即可
myBase Desktop 6.0 破解方法 -
yunzhu:
LZ写博客不太注重排版啊,排版不行别人没法看的
PermGen space
JAVA基类和派生类
从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。
在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用。
Java代码 收藏代码
public class Humans {
Humans(){
System.out.println("我是人!");
}
}
Java代码 收藏代码
public class Student extends Humans{
Student(){
System.out.println("我是学生!");
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student();
}
}
输出结果为:
我是人!
我是学生!
可以发现,总是基类的构造器先被初始化。
但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。
Java代码 收藏代码
public class Humans {
private String name;
Humans(String name){
System.out.println("我是叫"+name+"的人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
private String name;
Student(String name){
super(name);
System.out.println("我是学生!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student("zhangsan");
}
}
输出结果:
我是叫zhangsan的人
我是学生!
如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。
但是如果Humans的代码变成这样就不会错。如下代码:
Java代码 收藏代码
public class Humans {
private String name;
Humans(){
System.out.println("我是人!");
}
Humans(String name){
System.out.println("我是叫"+name+"的人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
private String name;
Student(String name){
//super(name);
System.out.println("我是学生!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student("zhangsan");
}
}
输出结果为:
我是人!
我是学生!
原因是,如果基类有一个无参的构造器,就算派生类不用super显示调用基类的构造函数,编译器也会自动
去调用基类的无参构造函数。
所以上面的代码不会报错,输出结果也不是
我是叫zhangsan的人
我是学生!
而是
我是人!
我是学生!
派生类继承了基类的所有public和protected属性和方法,代码如下:
Java代码 收藏代码
public class Humans {
public String sex;
protected int age ;
private String name;
Humans(String sex,String name,int age){
this.sex = sex;
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
Student(String sex ,String name,int age){
super(sex,name,age);
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
Student s = new Student("男","zhangsan",10);
System.out.println(s.sex);
System.out.println(s.name);
System.out.println(s.age);
}
}
上面的System.out.println(s.name);会报错,因为name是private属性,如需访问,采用get方法:
Java代码 收藏代码
System.out.println(s.getName());
输出结果为:
男
zhangsan
10
如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。如将student改为如下代码:
Java代码 收藏代码
public class Student extends Humans{
public String sex;
protected int age ;
private String name;
Student(String sex ,String name,int age){
super(sex,name,age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果为:
null
null
0
因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。
只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:
Java代码 收藏代码
public class Student extends Humans{
public String sex;
protected int age ;
private String name;
Student(String sex ,String name,int age){
super(sex,name,age);
this.sex = sex;
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果为:
男
zhangsan
10
要注意的是,super必须在构造器的最前面,不然会报错。
从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。
在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用。
Java代码 收藏代码
public class Humans {
Humans(){
System.out.println("我是人!");
}
}
Java代码 收藏代码
public class Student extends Humans{
Student(){
System.out.println("我是学生!");
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student();
}
}
输出结果为:
我是人!
我是学生!
可以发现,总是基类的构造器先被初始化。
但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。
Java代码 收藏代码
public class Humans {
private String name;
Humans(String name){
System.out.println("我是叫"+name+"的人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
private String name;
Student(String name){
super(name);
System.out.println("我是学生!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student("zhangsan");
}
}
输出结果:
我是叫zhangsan的人
我是学生!
如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。
但是如果Humans的代码变成这样就不会错。如下代码:
Java代码 收藏代码
public class Humans {
private String name;
Humans(){
System.out.println("我是人!");
}
Humans(String name){
System.out.println("我是叫"+name+"的人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
private String name;
Student(String name){
//super(name);
System.out.println("我是学生!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
new Student("zhangsan");
}
}
输出结果为:
我是人!
我是学生!
原因是,如果基类有一个无参的构造器,就算派生类不用super显示调用基类的构造函数,编译器也会自动
去调用基类的无参构造函数。
所以上面的代码不会报错,输出结果也不是
我是叫zhangsan的人
我是学生!
而是
我是人!
我是学生!
派生类继承了基类的所有public和protected属性和方法,代码如下:
Java代码 收藏代码
public class Humans {
public String sex;
protected int age ;
private String name;
Humans(String sex,String name,int age){
this.sex = sex;
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java代码 收藏代码
public class Student extends Humans{
Student(String sex ,String name,int age){
super(sex,name,age);
}
}
Java代码 收藏代码
public class test {
public static void main(String args[]){
Student s = new Student("男","zhangsan",10);
System.out.println(s.sex);
System.out.println(s.name);
System.out.println(s.age);
}
}
上面的System.out.println(s.name);会报错,因为name是private属性,如需访问,采用get方法:
Java代码 收藏代码
System.out.println(s.getName());
输出结果为:
男
zhangsan
10
如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。如将student改为如下代码:
Java代码 收藏代码
public class Student extends Humans{
public String sex;
protected int age ;
private String name;
Student(String sex ,String name,int age){
super(sex,name,age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果为:
null
null
0
因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。
只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:
Java代码 收藏代码
public class Student extends Humans{
public String sex;
protected int age ;
private String name;
Student(String sex ,String name,int age){
super(sex,name,age);
this.sex = sex;
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果为:
男
zhangsan
10
要注意的是,super必须在构造器的最前面,不然会报错。
发表评论
-
HttpClient4.X的代理密码
2018-07-11 23:48 868HttpClient4.X的代理添加实现(转自http://b ... -
Enable debug logging for this logger for a complete list of JARs that were scann
2018-06-28 21:59 1783修改EL表达式,例如"${owner.new}& ... -
job spring3--spring4
2017-12-28 09:21 452job spring3-->spring4 org ... -
java的(PO,VO,TO,BO,DAO,POJO)解释
2017-06-12 10:26 524java的(PO,VO,TO,BO,DAO,POJO) ... -
高內聚、低耦合。多聚合、少繼承
2017-05-22 15:52 786面向對象原則:高內聚、低耦合。多聚合、少繼承 2015-05 ... -
savesavesavesavesavesave
2017-05-18 17:24 484savesavesavesavesavesave uploa ... -
eclipse 图标的含义
2016-10-13 15:11 507... -
log4j-struts异常日志打印
2016-08-24 17:04 1056log4j.appender.myfile.layout.Co ... -
struts2 Action中获取request, response对象
2016-07-21 09:43 1165ajax不能完成文件下载, ... -
request和response的中文乱码问题
2016-03-04 10:39 1373request和response的中文乱码问题 request ... -
sun.misc.BASE64Encoder找不到jar包的解决方法
2015-06-29 15:10 839sun.misc.BASE64Encoder找不到jar包的解 ... -
jar 包 用途(jar功能对照表)
2015-04-08 16:07 1630jar包用途(jar功能对照表) axis.jar SOAP ... -
struts上传
2014-08-22 15:37 470jsp页面 <meta http-equiv=" ... -
java调用打印机打印自定义的图片
2014-08-19 16:03 3816package test; import java.awt. ... -
web.xml配置详解
2014-02-20 08:56 8152007-10-16 17:12 Web.XML 配 ... -
不要使用sun.misc.BASE64Encoder
2014-02-18 10:10 1171一直以来Base64的加密解密都是使用sun.misc包下的B ... -
自定义Result
2014-01-13 10:18 745自定义Result 5.7.1 什么是自定义Result ... -
ant+javadoc生成API文档
2014-01-02 17:16 958ant+javadoc生成API文档 分类: ant 2006 ... -
ssi包下载
2013-12-27 10:15 963Spring官网改版后找了好 ... -
webAppRootKey参数问题
2013-12-25 14:40 811...
相关推荐
在Java中,类是对象的蓝图,它定义了对象的状态(数据成员)和行为(方法)。第七章可能会涉及如何创建和实例化类,以及如何理解类的构造函数。习题答案会展示如何通过类来封装数据和实现信息隐藏。 二、继承 Java...
题目:定义三个类Point,Circle和Cylinder,Point类为基类,为上述3个类添加计算面积的成员函数Area(),要求函数Area()采用虚函数的形式,并通过基类指针调用虚函数Area()。 编程环境:vs2010 属性:控制台应用程序...
2. `private`继承:基类中的公有成员和保护成员在派生类中变为私有,不能直接被派生类的外部访问。 3. `protected`继承:基类中的公有成员和保护成员在派生类中变为保护,只能被派生类及其子类访问。 基类的私有...
在面向对象编程中,类的继承是...在阅读和分析源代码时,注意观察派生类如何访问和修改基类的成员,以及如何通过构造函数、成员函数和虚函数来实现特定的继承行为,这将有助于深入理解这两种派生方式的差异和应用场景。
多态思维导图.xmind
`Student`类和`Teacher`类都是`Person`类的派生类,这意味着它们继承了`Person`的所有属性和方法。`Student`类增加了`classid`(班级ID)和`score`(分数)两个私有成员变量,以及对应的公有成员函数来设置和获取...
- **继承** 是面向对象编程的一个核心特性,允许我们定义一个类(称为子类或派生类)继承另一个类(称为基类或父类)的属性和行为。 - **派生** 是指创建一个新的类,它从现有类继承属性和行为的过程。 2. **继承...
这在某些情况下能提供更大的灵活性,但可能导致命名冲突和菱形问题(即一个派生类有两个基类,而这两个基类又共享一个共同的基类,导致如何处理共享基类的成员的重复问题)。 7. **基类与派生类的转换** - C++支持...
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也...
首先,关于字符串,Java中有两种主要的字符串类:`String`和`StringBuffer`。`String`类表示不可变的字符序列,一旦创建,其内容就不能改变,因此适合用于存储不需要修改的数据。例如,当字符串作为常量使用或者在不...
**抽象类和接口的区别** - **抽象类**:可以包含抽象方法和具体实现,不能被实例化。 - **接口**:只能包含抽象方法,没有具体实现,可以被多个类实现。 #### 20. **final finally finalize 的区别** - **final*...
- 方法的签名必须在基类和派生类中保持一致,这是Java中方法重写的条件。 - 返回类型的要求:返回对象类型必须相同,或者返回对象类型必须是协变的,这意味着派生类对象可以赋值给基类引用,且不影响方法返回值的...
设计一个Person类,有Person类派生一个Student类和一个Teacher类,Student类包括姓名,编号,和成绩。Teacher类包括姓名,编号,职务和部门。又要用的来下载啊,希望对你有所帮助。
类和类之间的继承关系可以用 UML 符号表示,如图 5-1 所示,父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。 继承的优点是可以使软件的代码得到重用,节省了程序的开发时间...
在Java中,当一个基类引用指向一个派生类对象,并调用方法时,实际执行的是子类中重写(Override)的方法,而非基类的方法。这是因为Java在运行时会根据实际的对象类型来确定调用哪个方法,这就是所谓的运行时多态性...
面向对象程序设计是Java开发的核心思想,它通过类和对象来模拟现实世界中的实体和行为。在这个任务中,我们将深入探讨如何使用Java实现这个概念。 首先,我们需要设计一个`Circle`类来表示圆形。这个类应该包含一个...
在C++和Java中,覆盖都会导致派生类的方法替代基类的同名方法。 重载(Overload)是指在同一作用域内定义多个同名但参数列表不同的函数。在C++中,函数的调用基于参数列表和类型,而在Java中,除了参数列表,方法名...
5. **基类和派生类的方法的返回对象类型必须相同或者返回对象类型必须是协变的**:协变指的是如果子类可以替代父类,则子类类型也可以作为父类类型的返回值。 6. **派生类的方法的访问说明符不能比基类有更多的限制*...
- **派生类**(Derived Class 或 Subclass)是继承自其他类的新类,它不仅包含基类的特性,还可以添加新的属性和方法,甚至可以覆盖(Override)基类中的方法。 3. **继承的语法**: 在Java中,定义一个类继承另...