Java default package protected

Java package

A package is a grouping of related types providing access protection and name space management. Packages in Java is a similar concept to namespaces in C#.

Creaging a package in Java

A package is declared with the package keyword. This statement must be placed at the top of every source file. There can be only one such statement in each source file. The Java source files must be placed in directories that match the package name.

All types defined in the file with the above package are part of the com.zetcode package. A class Being has a fully qualified name com.zetcode.Being .

There are millions of Java programmers worldwide. To avoid potential name conflicts, there is a naming convention in Java. The package names use reversed Internet domain names. The letters are written in lowercase. There can be only one zetcode.com domain name so using a reversed name com.zetcode for the packages will make them unique. A Java source file with a com.zetcode package must be located in the com/zetcode subdirectory. Package names are written in all lower case to avoid conflict with the names of classes or interfaces.

The import keyword is used at the beginning of a source file to specify types (classes, interfaces, enumerations, or annotations) or entire Java packages to be referred to later without including their package names in the reference. Import statements can import static members of a class (methods and variables).

Читайте также:  Remove function in python list

Using the * wildcard character, we can import the whole package at a time. After this import, we can refer to all types of the java.awt package without their fully qualified names.

The java.awt.event subpackage is not imported with the java.awt.* import. Subpackages must be imported independently.

In this case, only Random class is imported. Now the Random class can be referenced using its simple class name.

Core packages in Java

  • java.lang — basic language functionality and fundamental types
  • java.util — collection data structure classes
  • java.io — Java API for file operations
  • java.math — multiprecision arithmetics
  • java.nio — the Non-blocking I/O framework for Java
  • java.net — networking operations, sockets, DNS lookups, .
  • java.security — key generation, encryption and decryption
  • java.sql — Java Database Connectivity (JDBC) to access databases
  • java.awt — basic hierarchy of packages for native GUI components
  • javax.swing — hierarchy of packages for platform-independent rich GUI components
  • java.beans — Contains classes related to developing beans — components based on the JavaBean architecture.
  • java.text — Provides classes and interfaces for handling text, dates, numbers, and messages in a manner independent of natural languages.
  • java.rmi — Java API for remote method invocations.
  • java.time — The main API for dates, times, instants, and durations.

The java.lang package is available without the use of an import statement.

Practical example

The following example shows how to create a package and import types.

package com.zetcode; import java.util.Random; public class Packages < public static void main(String[] args) < var r = new Random(); int x = r.nextInt(); System.out.println(x); java.time.LocalDateTime dt = java.time.LocalDateTime.now(); System.out.println(dt); >>

The example uses two types: the Random class and the LocalDateTime class. The first class is imported and the second is referred by its fully qualified name.

We declare a package with the package keyword. The Packages.java file must be located in the com/zetcode subdirectory.

This code line enables us to use the Random class without the package name.

Here we use the Random without using its full name.

java.time.LocalDateTime dt = java.time.LocalDateTime.now();

If we did not use the import keyword on a type, we can refer to it only by its full name — java.time.LocalDateTime in our case. The import keyword saves a lot of typing.

$ ls com/zetcode/ Packages.java

The Packages.java source file is placed in the com/zetcode subdirectory. The package name must reflect the directory structure.

$ javac com/zetcode/Packages.java

We compile the source file with the javac tool. The tool is called from the parent directory of the com/zetcode directory.

$ java com.zetcode.Packages 897739291 2022-09-26T12:25:06.699181327

Java package-private visibility

If we do not specify any access modifier (e.g. private , protected , or public ), we have a package-private visibility. In such a case, variables and methods are accessible within the same package. Classes in other packages cannot access classes and members declared with package-private access.

Java default package

If no package is declared, all types defined in that file are part of a default unnamed package. It is recommended to always place your types in a package. Even for small programs.

public class DefaultPackage < public static void main(String[] args) < System.out.println("A class in a default package"); >>

The DefaultPackage class is part of the default package.

If we do not specify a package, we do not place the source file in a specific subdirectory.

$ javac DefaultPackage.java $ java DefaultPackage A class in a default package

We compile the code and run the application. The source file and the bytecode is located in the current working directory.

Java automatic imports

Java compiler automatically imports two packages: java.lang and the current package.

package com.zetcode; public class Constants

The Constants class is located in the same package as the AutomaticImports which is referring to its version member.

package com.zetcode; public class AutomaticImports < public static void main(String[] args) < String os = System.getProperty("os.name"); System.out.println(os); System.out.println(Constants.version); >>

In this example, we refer to some classes that are automatically imported by Java compiler.

String os = System.getProperty("os.name");

The String and System classes are part of the java.lang package.

System.out.println(Constants.version);

The Constants class is located in the same package as the AutomaticImports class. Therefore, we can access the class and its member without using the fully qualified name or utilizing the import keyword.

$ ls com/zetcode/ AutomaticImports.java Constants.java

Both AutomaticImports.java and Constants.java files are located in the same subdirectory.

$ javac com/zetcode/AutomaticImports.java com/zetcode/Constants.java
$ java com.zetcode.AutomaticImports Linux 1.0

This is a sample output of the com.zetcode.AutomaticImports program.

Java static imports

If we often use some static members, we can use import static statement to refer to them later without a full class name. Static imports should be used with caution.

package com.zetcode; import static java.lang.Math.E; import static java.lang.Math.PI; import static java.lang.Math.abs; public class StaticImport < public static void main(String[] args) < System.out.println(E); System.out.println(PI); System.out.println(abs(-5)); >>

In this example, we refer to two constants and one static method.

import static java.lang.Math.E; import static java.lang.Math.PI; import static java.lang.Math.abs;

We use the import static statement to enable referring to them without their full names.

System.out.println(E); System.out.println(PI); System.out.println(abs(-5));

We refer to these three members without their class name.

$ java com.zetcode.StaticImport 2.718281828459045 3.141592653589793 5

In this article we covered packages in Java. We have shown how organize our code in packages.

Author

My name is Jan Bodnar and I am a passionate programmer with many years of programming experience. I have been writing programming articles since 2007. So far, I have written over 1400 articles and 8 e-books. I have over eight years of experience in teaching programming.

Источник

Java Access Modifiers

Java provides four access modifiers to set access levels for classes, variables, methods and constructors i.e. public, private, protected and default. These access level modifiers determine whether other classes can use a particular field or invoke a particular method.

Let’s quickly compare these access modifiers in nutshell.

  • public – accessible everywhere
  • protected – accessible in the same package and subclasses outside the package
  • default – accessible only in the same package
  • private – accessible only in the same class

The access specifiers can be ordered based on their strictness as below. The public is the least restrictive, and the private is the most restrictive.

public > protected > package-private (or default) > private

The public members are accessible from everywhere. A public class, method, constructor, or interface could be accessed from any other class in the application. However, if the public class we are trying to access is in a different package, then we must import the class before using it.

public class Data < private String format; public String getFormat() < return this.format; >public void setFormat(String format) < this.format = format; >>

In the above example, getFormat() and setFormat() methods are public so they can be accessed from any class.

Please note that the fields in an interface are implicitly public static final and the methods in an interface are, by default, public .

The protected members are accessible by the classes of the same package and the subclasses outside the package.

In Data class, the method displayMessage() is declared protected, so it can be accessed by all the classes present in the same package where HelloWorld.java is present, as well as child classes present in other packages as well.

If we try to access the displayMessage() in another package without extending the Data class, we get the following compilation error:

'displayMessage()' has protected access in 'com.howtodoinjava.core.basic.accessModifiers.package1.Data'

Protected access modifier

When we inherit the Data class, then we can access the displayMessage() outside the current package.

public class Main extends Data < public static void main(String[] args) < Main main = new Main(); main.displayMessage(); >>

The default access modifier means we do not explicitly declare an access modifier for a class, field, method, etc. The default members are accessible only by the classes in the same package.

Let us remove the protected access from the displayMessage() in the Data class. It changes the access to default.

Now when we try to access the displayMessage() in the child class outside the package, we will start getting the compilation error:

'displayMessage()' is not public in 'com.howtodoinjava.core.basic.accessModifiers.package1.Data'. Cannot be accessed from outside package

default access modifier

The private access modifier is the most restrictive access level. The topmost classes and interfaces cannot be private. The private members are accessible within the same class only. The private methods, variables, and constructors can only be accessed within the declared class itself.

We are modifying the previous example again by changing the default access to private access for the displayMessage() method.

Now the method is private so no other class can access it directly.

2. Levels of Access Control

There are two levels of access control.

  • Class level access – allows modifiers to be public, or package-private (default).
  • Method level access – allows modifiers to be public, private, protected, or package-private (default).

Local variables and formal parameters cannot take access specifiers. Since they are inherently inaccessible to the outside according to scoping rules, they are effectively private.

Both private and protected can be (and frequently are) applied to nested classes and interfaces, just never top-level classes and interfaces.

Access levels affect us in two ways.

  • First, when you use classes that come from another source, access levels determine which members of those classes your own classes can use.
  • Second, when you write a class, you must decide what access level every member variable and every method in your class should have.

If other programmers use your class, you want to ensure that errors from misuse cannot happen. Access levels can help you do this.

Источник

Оцените статью