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的继承的更多相关文章

  1. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  2. 深入理解Java中的继承

    对于面向对象的程序设计而言,每一个程序员都应该去了解Java中的封装,继承和多态,那么我今天来说的主要是以继承为核心的主题. 一.关于对继承的理解. 继承是面向对象的三大特性之一,是java中实现代码 ...

  3. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  4. (转)java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  5. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  6. Java提高篇之理解java的三大特性——继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  8. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  9. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

随机推荐

  1. twemproxy explore,redis和memcache代理服务器

    twemproxy,也叫nutcraker.是一个twtter开源的一个redis和memcache代理服务器. redis作为一个高效的缓存服务器,非常具有应用价值.但是当使用比较多的时候,就希望可 ...

  2. Python操作rabbitmq 实践笔记

    发布/订阅  系统 1.基本用法 生产者 import pika import sys username = 'wt' #指定远程rabbitmq的用户名密码 pwd = ' user_pwd = p ...

  3. android BitMap回收

    第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bit ...

  4. Python:如何删除文件中的空白行?

    def delblankline(infile,outfile): infopen = open(infile,'r') outfopen = open(outfile,'w') lines = in ...

  5. VisualStudio控制台输出窗口一闪而过

    我用到开发环境是visual studio 2010,写的简单的控制台程序,结果一按control+F5输出窗口出现后立刻就消失了(平时很少这样的呀),按照以往经验,加上了在程序结尾getchar() ...

  6. 一行实现QQ群组头像,微信群组,圆角等效果. 并支持url直接加载图片

    说点题外话. Coding中我们总是经历着这么几个过程. 学会使用: 不管是API也好, 开源库也好. 总是在最开始的学会去用. 了解实现原理: 可能会因为一些不兼容, 代码的异常状态的处理不够完美等 ...

  7. dateset添加一列

    ds.Tables[].Columns.Add("short_name", System.Type.GetType("System.String"));//直接 ...

  8. js屏幕尺寸 笔记

    "屏幕分辨率为:"+screen.width+"*"+screen.height "屏幕可用大小:"+screen.availWidth+& ...

  9. navigation和tabbar上的文字.图片 自定义

    [[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blackColor] ...

  10. Asp.net导出Excel(HTML输出方法)

    主要思路: 实例化Gridview,将值绑定后输出...(用烂了的方法) 贴上核心代码: public static void ExportToExcel(DataTable dataList, st ...