个人理解java的继承
java的类是属于单继承的。在继承这一块上我本来有一个很大的误区,就是觉得父类中private定义的成员无法被继承。直到网上的大神给我指出private是可以被继承的,会在内存中,只是在子类的对象中不能被访问到。
下面以一个例子来讲讲我对继承的一些理解。
package 继承;
public class Animal {
// 属性姓名
private String name;
// 属性年龄
private int age;
public Animal(){
System.out.println("无参构造函数测试是哪个对象"+this.getClass());
System.out.println("无参父类构造方法");
}
public Animal(String name,int age){
System.out.println("有参构造函数测试是哪个对象"+this.getClass()); //cat对象
this.say(); //调用子类自己的方法。
System.out.println("有参父类构造方法");
this.name=name;
this.age=age; //在这边的this应该会自己转成子类对象的父类对象部分。
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 方法say
public void say(){
System.out.println("姓名是="+name);
System.out.println("我是一个动物,我叫:"+this.getName()+"我的年龄是:"+this.getAge());
}
public static void main(String[] args) {
System.out.println(111);
}
}
定义了一个类Animal,他有私有成员name跟age,通常父类的私有成员在子类中是不能被访问到的,因此父类中经常用getXXX()和setxxx()方法来对父类的私有成员进行访问控制。
package 继承;
public class Dog extends Animal{
public static void main(String[] args) {
//设置了父类的私有数据成员
Dog dog=new Dog();
dog.setName("Pick");
dog.setAge(1);
dog.say();
System.out.println(dog.getName()); //获得的是父类的。
}
}
执行结果:
以上代码建立了一个继承于父类Animal的子类Dog。当执行Dog dog=new Dog();这句话的时候,其实构造函数是按照以下顺序进行的。
(1)执行父类无参的构造函数
(2)执行子类的默认构造函数,在这边就是什么都不执行。
以上过程可以看做是实例化父类对象跟实例化子类对象。
因为Animal的name跟Age都是用private修饰的,子类无法直接访问赋值,所以通过dog.setName("Pick");
dog.setAge(1);这两个方法去赋值。值得注意的是这两个变量是父类的成员变量,如果用dog.name是会报错的。不过用dog.getname()可以访问到被设置的name的值。在这边我也是想了很久,刚开始一直认为这个设置的name值应该是属于子类的,毕竟是用子类对象去设置的,后面也是纠结了很久才相同,你子类对象根本就访问不到name跟Age,之所以在new子类对象时会先去执行父类的构造函数也就是为了对父类的成员变量赋值。用子类调用的setXXX()跟getXXX()都是为了对父类的private属性进行初始化操作。特别的用this.setxxx()跟this.getXXX().
此外,还有一点需要说明,在父类的构造函数中,若是使用this,例如this.name,其实这边的this指的是子类,this指代的是当前对象,而这边又是有子类new出来的。可能有的又会说那为什么在这边可以使用this.name而不会报错。其实这个我也不是很理解,大概这边的范围已经在父类中了吧,而且这边操作的也是父类的成员。
纯个人理解,希望有错的能有人帮我指出,自学难,但不放弃。
个人理解java的继承的更多相关文章
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- 深入理解Java中的继承
对于面向对象的程序设计而言,每一个程序员都应该去了解Java中的封装,继承和多态,那么我今天来说的主要是以继承为核心的主题. 一.关于对继承的理解. 继承是面向对象的三大特性之一,是java中实现代码 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- (转)java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- Java提高篇之理解java的三大特性——继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
随机推荐
- C# FromBase64String 解码换行问题
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如 ...
- Koa2 的安装运行记录(一)
1.参考koa+react(一) http://blog.suzper.com/2016/10/19/koa-react-%E4%B8%80/ 为了使用 KOA2 能够运行,必须能够使用ES7语法 a ...
- Oracle生成指定表的列名,并前后添加select from
表的列名比较多的时候,手工一个个的写列名比较麻烦,这个函数可以让人偷偷懒 create or replace function f_GetCols(p_TableName in varchar2/*获 ...
- iOS 获取沙盒路径方法
//获取家目录路径的函数: NSString *homeDir = NSHomeDirectory(); //获取Documents目录路径的方法: NSArray *paths = NSSearch ...
- java中的集合
集合比数组的优势: 1.集合可以存任意类型的变量,长度是可变的 2.数组只能存同一类型的变量,长度是固定的 3.集合中只能存对象 List集合 : 接口 提供公有的方法 特有的方法: 1.List中 ...
- JS和JQuery的总结
JS部分 一, 词法结构 区分大小 注意://单行 /*多行注释*/ 字面量(直接量literal) 12 // 数字 5.8//小数 "hello" 'hello' true ...
- Mac下Boost环境搭建
Boost,一个功能强大.跨平台.开源而且免费的C++程序库,可以在其官网了解更多:http://www.boost.org,C++标准经过不断的升级完善,现在已经功能越来越吸引人了,Boost开发过 ...
- thinkphp 3.23语言包加载
模块home: 1.config 里添加 配置 //'配置项'=>'配置值' 'LANG_SWITCH_ON' => true, // 开启语言包功能 'LANG ...
- 卸载 ibus 使Ubuntu16.04任务栏与启动器消失 问题解决
经查证是unity误卸载了,我使用了命令: sudo apt-get remove --purge ibus 解决方法是: 使用以下命令:重置compiz: dconf reset -f /org/c ...
- 哈,我自己翻译的小书,马上就完成了,是讲用python处理大数据框架hadoop,spark的
花了一些时间, 但感觉很值得. Big Data, MapReduce, Hadoop, and Spark with Python Master Big Data Analytics and Dat ...