关于java中protected访问控制权限修饰符的控制范围

关于java中protected修饰符修饰的成员访问权限范围
用代码块功能插入代码,请勿粘贴截图
运行结果及报错内容
/*     
          创建三个类 ,分别在不同的三个包中,父亲类继承爷爷类,儿子类继承父亲类,
          现在在父亲类里面创建一个儿子    
         对象实例,然后通过这个实例去访问继承的受保护的 eat ( ) 方法,
        想问下为什么这里可以访问?,
        儿子类中的 eat()方法是来自父亲类还是来自爷爷类?,
        怎么判定一个protected成员是来自哪个类哪个包?,
*/
package com.myself5;
//爷爷类
public class GrandFather {
    
    protected void eat() {
        
    }
}


package com.myself3;
import com.myself4.Son1;
import com.myself5.GrandFather;
//父亲类
public class Father extends GrandFather{
    
    protected int i =10;
    protected void run() {
        
    }
    public static void main(String[] args) {
        Son1 s = new Son1();
        s.eat();
    }
}

package com.myself4;
import com.myself3.Father;
import com.myself3.Son;
//儿子类
public class Son1 extends Father{
    public static void main(String[] args) {
        
    }
}

儿子类中的eat()来自父亲类,父亲类中的eat()来自爷爷类,因为父亲中没有@Override eat(),所以儿子类中的eat()来自爷爷类
顺着当前子类的父类一级一级往上找,如果父类对protected方法进行了重写就会执行对应的重写方法,没有重写再继续往上找

img