Shouldn't “import foo.*” also include subpacka

2019-02-17 02:32发布

问题:

Studying Java, I've thought about a, to me, rather confusing property of many tutorials. Consider the following two imports from a sample tutorial:

import java.awt.*;
import java.awt.event.*;

The first line obviously imports the java.awt package, and the second one awt's subpackage. But shouldn't the asterix include all sub-packages? Hence, line one should do the trick - line two shouldn't be needed? If it doesn't: then what's the true purpose/usage of the asterix?

For example, using SELECT * FROM foo in MySQL selects ALL fields from a table, perhaps I'm stupid to assume that this naturally is t he case.

回答1:

No, packages are taken as a whole. Even though it's often useful to think of them hierarchically, there is no notion within the Java language or compilation that says java.awt.event belongs to java.awt.

Your comparison with SQL tables isn't quite right because there's no such thing as a sub-table in SQL databases. Instead, imagine you had a table representing all your classes, with the following entries:

ID | Package   | Name
--------------------------
1  | awt       | SomeClassName1
2  | awt.event | SomeClassName2

Now, if you wanted to get awt classes, you'd say:

SELECT * FROM MyTable WHERE Package = 'awt'

You wouldn't expect this to give you both entries, just because the package name starts with awt, would you?



回答2:

See my answer here (and my comment). A wildcard only goes 1 level deep, not into subpackages



回答3:

Each package name ("a.b.c") is a discrete package. Two packages with similar naming prefix ("a.b.c" and "a.b.d", for example) are separate packages for the language, both for namespaces and for access control.

For humans, of course, this represents a possible relation between the packages.