首先更正一下,1、在java中一般不说什么什么函数的,都叫方法;2、定义的也不是叫函数名,而是叫对象名或叫变量名,因为这些都是存在stack中的,而你说的函数也就是方法是在code segment中的,方法不调用,就是一段没有用和代码,只有方法调用了才起到作用,学好java的最好方法就是分析好内存,可以自己给自己补点计算机专业的一本天书———编译原理,对学java有用。 其次,回答您的问题,不用定义这是可以的,如果你定义了一个变量名(对象名)就是在stack中申请了一个内存空间用来指向heap中的new出来的Cat对象,如果不定义,就是直接在heap中new一个Cat类的对象,而没有引用指向它,两种最后都是这个new出来的对象 end
代码可以这么用吗?? 不用定义一个新的函数名字 直接 申请空间??
确实把父类的cry()改为public的,那样new cat().cry()就没事了;
或者cry()继续为protected的,new tiger().cry()也正常;再或者,protected static void cry(), 这样new cat().cry()也正常。我乱了。。高手来分析总结一下吧。
如果不同包的的继承,protected是不能被子类访问的。
包优先于protected !如果不同包的继承,protected是不能被子类访问的。当然这也分情问,如果你用的是父类对象,那肯定是不可以的。如果用子类对象,那是可以的,我想这就是多态的表现吧。如果你加static的话,那根本不必要去创建对象,直接可以调用了。我的理解至少是这样的。
首先更正一下,1、在java中一般不说什么什么函数的,都叫方法;2、定义的也不是叫函数名,而是叫对象名或叫变量名,因为这些都是存在stack中的,而你说的函数也就是方法是在code segment中的,方法不调用,就是一段没有用和代码,只有方法调用了才起到作用,学好java的最好方法就是分析好内存,可以自己给自己补点计算机专业的一本天书———编译原理,对学java有用。
其次,回答您的问题,不用定义这是可以的,如果你定义了一个变量名(对象名)就是在stack中申请了一个内存空间用来指向heap中的new出来的Cat对象,如果不定义,就是直接在heap中new一个Cat类的对象,而没有引用指向它,两种最后都是这个new出来的对象
end
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
首先你的cry()方法是protected修饰的,所以在另外一个包中是无法访问到这个方法的。具体的访问权限见上表,不要想的太复杂,就这么简单。
子类可以继承不在同一个包里面的父类的protected方法和变量,但是继承了以后,只能用子类的引用来访问,而不能使用父类的引用来访问,因为不同包里面的protected是不可见的,而继承了以后就是自己的了
这个写法是可以的。
看下边代码:package com.p2;
import com.p1.*;
public class Tiger extends Cat { void f()
{
super.cry(); //错误吗?
}
static void g()
{
new Cat().cry(); //错误吗?
new Tiger().cry(); //错误吗?
}
}
上边的super.cry(); 就不是:只能用子类的引用来访问。这有错误吗?