1.对象和类的简单解析 (2)

因为多个个体,属性可能不同,比如我身高180,你身高150,我18岁,你30了。但我们都能跑、能跳、能吃饭,这些技能(method)都是共通的,没必要和属性数据一样单独在堆空间各存一份,所以被抽取出来存放,可以减少内存的开支(猜测)

此时,方法相当于一套指令模板,谁都可以传入数据交给它执行,然后得到执行后的结果返回。

但此时会存在一个问题:张三这个对象调用了eat()方法,你应该把饭送到他嘴里,而不是送到李四嘴里。那么方法如何知道把饭送到哪里呢?

换句话说:共性的方法如何处理不同对象的特定的数据?

Java的this其实就是解决这个问题的。可以理解为一个对象内部一直持有一个引用,这个引用就是this,当你调用某个方法时,必须传递这个对象引用,然后方法根据这个引用就知道当前这套指令是对哪个对象的数据进行操作了。

2. static与this

我们都知道,static修饰的属性或方法其实都是属于类的,是所有对象共享的。但接触Python后我多了一层理解。之所以一个变量或者方法要声明为static,是因为

static变量:大家共有的,大家都一样,不是特定的差异化数据

static方法:这个方法不处理差异化数据

也就是说,static注定与差异化数据无关,即与具体对象的数据无关。

静态方法为例,当你确定一个方法只提供通用的操作流程,而不会在内部引用具体对象的数据时,你就可以把它定为静态方法。

这个其实和我们之前听到的解释不一样。网络上一贯的解释都是上来就告诉你静态方法不能访问实例变量,再解释为什么,是倒着解释的。而上面这段话的出发点是,当你满足什么条件时,你就可以把一个方法定为静态方法。

反过来解释,为什么Java中静态方法无法访问非静态数据(实例字段)和非静态方法(实例方法)。因为Java不会在调用静态方法时传递this,静态方法内没有this当然无法处理实例相关的一切。

3. 关于子类和父类

首先看一个demo关于子类和父类生成对象时候:

public class Demo { public static void main(String[] args) { /** * new一个子类对象 * 我们知道,子类对象实例化时,会隐式调用父类的无参构造 * 所以Father里的System.out.println()会执行 * 猜猜打印的内容是什么? */ Son son = new Son(); Daughter daughter = new Daughter(); } } class Father{ /** * 父类构造器 */ public Father(){ // 打印当前对象所属Class的名字 System.out.println(this.getClass().getName()); } } class Son extends Father { } class Daughter extends Father { }

首先我们需要明确的知道,子类在生成对象调用构造器时候,是肯定会默认调用父类的无参构造器,隐式的调用super(),但是我们一定要知道:并没有生成父类对象。

下面的demo是便于理解this以及父类和子类的关系,无法正常编译。

class Father{ /** this参数名接收参数值, this默认指向父类自身, 如果this是通过子类对象super(this)传入的, 那么this当然指向该子类对象 当然这种写法不合语法, 只是为了方便表达, Java做了相应的隐式处理 */ public Father(this){ System.out.println(this.getClass().getName()); } } class Son extends Father { public Son(this) { //把指向自身的this传给父类构造方法 super(this); } }

重点的理解:!!!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzfyf.html