posted 18 years ago
I am grateful to all of you for providing such a nice explanation which i cannot get in any books.
I could able to understand the same now. But still some gaps are there in my understanding the concept. Please provide me the necessary explanation for the queries rasied below.
Thnaks in advance to one and all.
Under section 6.6.2 of the java specifications,
Quote:
-----------------------------------------------------------
6.6.2 Details on protected Access
A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.
----------------------------------------------------------------------
Here what does it mean "the implementation of that object" --in what way?
Also,
under section 6.6.2.1 of the java specifications,
Quote:
--------------------------------------------------------------
6.6.2.1 Access to a protected Member
Let C be the class in which a protected member m is declared. Access is permitted only within the body of a subclass S of C. In addition, if Id denotes an instance field or instance method, then:
If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.
If the access is by a field access expression E.Id, where E is a Primary expression, or by a method invocation expression E.Id(. . .), where E is a Primary expression, then the access is permitted if and only if the type of E is S or a subclass of S.
_________________________________________________________________
what is the difference between ExpressionName (Q) and the Primary expression?
Quote:
_________________________________________________________________________________
Also in example 6.6.7 of the java specifications:
6.6.7 Example: protected Fields, Methods, and Constructors
Consider this example, where the points package declares:
package points;
public class Point {
protected int x, y;
void warp(threePoint.Point3d a) {
if (a.z > 0) // compile-time error: cannot access a.z
a.delta(this);
}
}
and the threePoint package declares:
package threePoint;
import points.Point;
public class Point3d extends Point {
protected int z;
public void delta(Point p) {
p.x += this.x; // compile-time error: cannot access p.x
p.y += this.y; // compile-time error: cannot access p.y
}
public void delta3d(Point3d q) {
q.x += this.x;
q.y += this.y;
q.z += this.z;
}
}
which defines a class Point3d. A compile-time error occurs in the method delta here: it cannot access the protected members x and y of its parameter p, because while Point3d (the class in which the references to fields x and y occur) is a subclass of Point (the class in which x and y are declared), it is not involved in the implementation of a Point (the type of the parameter p). The method delta3d can access the protected members of its parameter q, because the class Point3d is a subclass of Point and is involved in the implementation of a Point3d.
The method delta could try to cast (�5.5, �15.16) its parameter to be a Point3d, but this cast would fail, causing an exception, if the class of p at run time were not Point3d.
A compile-time error also occurs in the method warp: it cannot access the protected member z of its parameter a, because while the class Point (the class in which the reference to field z occurs) is involved in the implementation of a Point3d (the type of the parameter a), it is not a subclass of Point3d (the class in which z is declared).
___________________________________________________________________________________
what I didnot understand here is:
a)Point3d is not involved in the implementation of a Point.
b)Point3d, a subclass of Point is involved in the implementation of a Point3d.
Actually what does this imply:-->involving/not involved in the implementation of an object.
I am aware that we can implement the interfaces, where the classes implementing the interfaces have the contract with the interface being implemented by the corresponding classes. But what is this: implementation of an object?