java 继承的基本实现
来源:互联网 发布:js 是否为数字 编辑:程序博客网 时间:2024/05/24 15:40
继承的基本实现类的继承格式
在java中使用extends关键字完成类的继承关系,操作格式如下:
class 父类{}
class 子类 extends 父类{}
继承父类的功能,扩展子类的所有功能。
子类有时候也称之为派生类。
继承的进一步研究
子类对象的实例化过程
实例化子类对象:
1.先调用父类的构造->调用父类构造
2.再调用子类构造->调用子类构造
实例:
InstanceDemo.java
//输出:父类Person中的构造
子类Student中的构造
实际上此时隐含在Student的构造方法的第一行有以下代码:
super(); //调用父类的构造函数
即代码相当于:
注意点:在方法覆写时必须考虑到权限问题,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
访问权限一共有四种,现在只讲三种:
●private:只能被类内访问,权限最第
●default:相当于什么都不声明
●public:最大的访问权限
●大小关系:private<default<public
如果降低了访问权限时如Person使用public而Student使用default时,会产生以下错误:
print() in Student cannot override print() in Person; attempting to assign weaker access privileges; was public void print()
//表示错误的,降低了权限
子类会自动调用覆写的方法,但此时如果非要调用父类中的方法的话,使用super()关键字。
如:Student构造方法调用父类的方法可以进行以下修改:
---------------------------------------------------------
问题:如果现在在父类中使用private 关键字声明了一个方法,那么在子类中使用default权限算是覆写吗?
答 :不是覆写.
------------------------------------------------------
输出:Student---------->void print()
此时,方法没有被覆写,而是相当于在子类中又重新定义了一个新的方法出来。
3.3 属性的覆写
在子类中声明了父类同名的属性。
3.4方法的覆写与的方法的重载
overloading overrideing
方法名称相同参数的类型或个数不同 方法名称参数的类型返回值类型全部相同
对权限没有要求 被覆写的方法不能拥有更严格的权限
发生在一个类中 发生在继承类中
3.5 super关键字
表示从子类调用父类中的指定操作,例如调用属性,方法,构造等。因为在子类实例化的时候会默认调用父类中的无参构造,如果现在希望调用有参构造方法,可以使用super方法传递参数。
当子类调用无参构造方法时,父雷中不存在无参构造方法,此时就会报错。因为子类会在无参构造方法第一行隐含调用super方法,解决方法为:父类定义一个无参构造方法,或使用super调用父类存在参数的方法。
不管任何时候,子类实例化时候先去调用父类中的构造方法,默认调用无参构造。
总结:
使用 super 调用无参方法
1.建立含无参构造的类。
2.建立含无参构造子类,继承父类。
3.子类中构造第一行添加或不添加super
使用 super 调用含参数的方法
1.建立含参构造的类。
2.建立含参子类(覆写构造函数),继承父类。
3.子类中构造第一行添加super(内部参数同父类构造方法)
this与super的区别
this super
属性访问:访问本类中的属性,如果本类没有这些属性则从父类中查找。 属性访问:访问父类中的属性
方法:访问本类中的方法,如果本类没有则从父类中查找。 方法:直接访问父类中的方法
调用构造:调用本类构造,必须放在构造方法首行。 调用构造:调用父类构造,必须放在子类构造方法的首行。
特殊:表示当前对象。 特殊:无此概念
对于this和super本身都可以调用构造方法,而且调用的时候都必须放在构造方法首行,所以两个关键字不能同时出现。
疑问:如果在构造方法中(子类)使用了this,那么是不是就不调用父类中的构造方法?
在java中使用extends关键字完成类的继承关系,操作格式如下:
class 父类{}
class 子类 extends 父类{}
继承父类的功能,扩展子类的所有功能。
class Person{ private String name; private int age; public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; }}class student extends Person{ //此处不添加任何代码}public class ExtDemo02{ public static void main(String args[]){ Student stu = new Student(); stu.setName("张三"); set.setAge(30); System.out.println(stu.getName()+stu.getAge()); }}
子类有时候也称之为派生类。
继承的进一步研究
子类对象的实例化过程
实例化子类对象:
1.先调用父类的构造->调用父类构造
2.再调用子类构造->调用子类构造
实例:
InstanceDemo.java
class Person{ private String name; private int age; public Person(){ System.out.println("父类Person中的构造方法"); } public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; }}class Student extends Person{ private String school; public Student(){ System.out.println("子类student中构造"); }}public class InstanceDemo{ public static void main(String args[]){ Student stu = new Student(); }}
//输出:父类Person中的构造
子类Student中的构造
实际上此时隐含在Student的构造方法的第一行有以下代码:
super(); //调用父类的构造函数
即代码相当于:
class Person{ private String name; private int age; public Person(){ System.out.println("父类Person中的构造方法"); } public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; }}class Student extends Person{ private String school; public Student(){ super(); System.out.println("子类student中构造"); }}public class InstanceDemo{ public static void main(String args[]){ Student stu = new Student(); }}
注意点:在方法覆写时必须考虑到权限问题,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
访问权限一共有四种,现在只讲三种:
●private:只能被类内访问,权限最第
●default:相当于什么都不声明
●public:最大的访问权限
●大小关系:private<default<public
如果降低了访问权限时如Person使用public而Student使用default时,会产生以下错误:
print() in Student cannot override print() in Person; attempting to assign weaker access privileges; was public void print()
//表示错误的,降低了权限
子类会自动调用覆写的方法,但此时如果非要调用父类中的方法的话,使用super()关键字。
如:Student构造方法调用父类的方法可以进行以下修改:
class Person{ private String name; private int age; public Person(){ System.out.println("父类Person中的构造方法"); } public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } public void print(){ System.out.println("just a moment!"); }}class Student extends Person{ private String school; public Student(){ super.print(); System.out.println("子类student中构造"); }}public class InstanceDemo{ public static void main(String args[]){ Student stu = new Student(); }}
---------------------------------------------------------
问题:如果现在在父类中使用private 关键字声明了一个方法,那么在子类中使用default权限算是覆写吗?
答 :不是覆写.
------------------------------------------------------
class Person{ private String name; private int age; public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } private void print(){ System.out.println("Person------>void print()"); }}class Student extends Person{ private String school; void print(){ System.out.println("Student-------->void print()"); }}public class InstanceDemo{ public static void main(String args[]){ Student stu = new Student(); stu.print(); }}
输出:Student---------->void print()
此时,方法没有被覆写,而是相当于在子类中又重新定义了一个新的方法出来。
3.3 属性的覆写
在子类中声明了父类同名的属性。
class Person{ public String name; private int age; public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } private void print(){ System.out.println("Person------>void print()"); }}class Student extends Person{ public String name; void print(){ System.out.println("父类中的属性:"+super.info); System.out.println("子类中的属性:"+this.info); }}public class OverrideDemo{ public static void main(String args[]){ Student stu = new Student(); stu.print(); }}
3.4方法的覆写与的方法的重载
overloading overrideing
方法名称相同参数的类型或个数不同 方法名称参数的类型返回值类型全部相同
对权限没有要求 被覆写的方法不能拥有更严格的权限
发生在一个类中 发生在继承类中
3.5 super关键字
表示从子类调用父类中的指定操作,例如调用属性,方法,构造等。因为在子类实例化的时候会默认调用父类中的无参构造,如果现在希望调用有参构造方法,可以使用super方法传递参数。
class Person{ private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; System.out.println("父雷Person中的构造方法"); } public void setName(String name){ this.name = name; } public void setInt(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } }class Student extends Person{ private String school; public Student(String name,int age,String school){ super(name,age); this.school = school; System.out.println("子类student中的构造方法"); }}public class OverrideDemo{ public static void main(String args[]){ Student stu = new Student("张三",30,"山东大学"); }}
当子类调用无参构造方法时,父雷中不存在无参构造方法,此时就会报错。因为子类会在无参构造方法第一行隐含调用super方法,解决方法为:父类定义一个无参构造方法,或使用super调用父类存在参数的方法。
不管任何时候,子类实例化时候先去调用父类中的构造方法,默认调用无参构造。
总结:
使用 super 调用无参方法
1.建立含无参构造的类。
2.建立含无参构造子类,继承父类。
3.子类中构造第一行添加或不添加super
使用 super 调用含参数的方法
1.建立含参构造的类。
2.建立含参子类(覆写构造函数),继承父类。
3.子类中构造第一行添加super(内部参数同父类构造方法)
this与super的区别
this super
属性访问:访问本类中的属性,如果本类没有这些属性则从父类中查找。 属性访问:访问父类中的属性
方法:访问本类中的方法,如果本类没有则从父类中查找。 方法:直接访问父类中的方法
调用构造:调用本类构造,必须放在构造方法首行。 调用构造:调用父类构造,必须放在子类构造方法的首行。
特殊:表示当前对象。 特殊:无此概念
对于this和super本身都可以调用构造方法,而且调用的时候都必须放在构造方法首行,所以两个关键字不能同时出现。
疑问:如果在构造方法中(子类)使用了this,那么是不是就不调用父类中的构造方法?
答:子类中不可能同时都调用this()方法,所以默认仍会调用父类的构造方法。
- java 继承的基本实现
- java 继承的基本实现
- java 继承的基本实现
- 继承的基本实现
- Java基本二:继承、实现
- Java面向对象高级--继承的基本实现--extends
- java继承的基本语法
- Java继承的实现
- JAVA 线程的两种基本实现方法(继承Thread类和实现Runnable接口)
- 高德基本地图的实现继承
- Java继承设计的基本技巧
- java script 继承的实现
- Java(继承的实现)
- Java中继承的实现
- java的继承和实现
- Java类的继承、接口的继承和实现
- 友盟统计的基本继承和实现
- javascript实现类似java的继承,单个方法继承
- lua 获得系统时间
- ARM GCC浮点相关总结
- SVN命令行做revert
- ActiveMQ使用总结
- 设计模式之六 适配器模式(Adapter)
- java 继承的基本实现
- Windows下ActiveMQ下载、安装部署
- 委托
- oracle数据库导入导出
- 收集并统计网络流量
- javascript通过json2.js处理json格式数据
- VirtualBox使用教程图解
- 京广高铁26日全线通车 中外记者登车体验
- Object c 调用 C++类注意事项