个人理解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类型,这就是虚拟机的类加载机制 ...
随机推荐
- SystemErrorCodes
有人把SystemErrorCodes整理成了类,并定义了方法,用于返回消息,他大概不知道FormatMessage的用法,放在这里做参考吧 C# code snipppet class System ...
- JavaScript高级程序设计学习笔记--事件
HTML事件处理程序 <input type="button" value="Click Me" onclick"showMessage()&q ...
- .NET 面向对象基础
封装 ...
- quartz 线程问题
2个任务一起使用quartz来调度,但是有一个任务总是会莫名其妙的暂停掉,排查了下,原来组内成员在写JOB任务时候,在JOB中写了个while(true) { 执行业务 休眠10分钟} 导 ...
- 字符串的replace()方法隐藏着什么不可告人秘密?
最近在做JS算法项目时发现一个令我匪夷所思的问题, 这里想记录一下问题. 首先介绍一下字符串replace()方法的基本用法. replace() 方法使用一个替换值(replacement)替换掉一 ...
- display:box和display:inline-box的区别
display:box我想大家很熟悉,那么display:inline-box呢,今天在项目中需要设置这样的属性box-align:center,那么就想到用 display:box;如果设置BOX, ...
- Python 元组
#不可变序列-----元组 tuple #元组和列表十分相似,元组和字符串一样都是不可变的. #元组由不同的元素组成,每个元素可以存储不同类型的数据,例如 #字符串.数字和元组 #元组通常代表一行数据 ...
- eclipse运行速度优化(解决狂读盘、发布慢、CPU100%等问题)
转自:http://blog.csdn.net/wyp_810618/article/details/8953921 我的ECLIPSE运行时速度奇慢,具体表现为: 1.只要ECLIPSE启动后,硬盘 ...
- jQuery基础知识准备
一. 代码风格在jQuery程序中,不管是页面元素的选择.内置的功能函数,都是美元符号"$"来起始的.而这个"$"就是jQuery当中最重要且独有的对象:jQu ...
- hdu分类 Math Theory(还有三题!)
这个分类怎么觉得这么水呢.. 这个分类做到尾的模板集: //gcd int gcd(int a,int b){return b? gcd(b, a % b) : a;} //埃氏筛法 O(nlogn) ...