Here is a Java program that demonstrates how to find the 2nd largest number in an array:

**
class SecondLargest
{
public int findSecondLargest(int[] arr, int n) {
int firstLargest = Integer.MIN_VALUE;
int secondLargest = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
if (arr[i] > firstLargest) {
secondLargest = firstLargest;
firstLargest = arr[i];
} else if (arr[i] > secondLargest && arr[i] != firstLargest) {
secondLargest = arr[i];
}
}
return secondLargest;
}
}
public class Main {
public static void main(String[] args) {
SecondLargest sl=new SecondLargest();
int[] arr = {1, 14, 2, 16, 10, 20, 5};
int n = arr.length;
int secondLargest = sl.findSecondLargest(arr, n);
System.out.println("Second largest element is " + secondLargest);
}
}
**

In this program, The findSecondLargest method takes two arguments; the array, and the length of the array.

It then initialize two variables firstLargest and secondLargest with the minimum possible integer value(Integer.MIN_VALUE).

The method then loops through the array, comparing each element with firstLargest. If an element is greater than firstLargest, the firstLargest is updated and previous value is assigned to secondLargest.

If an element is not greater than the current firstLargest but is greater than the current secondLargest and it's not equal to firstLargest, it's assigned to secondLargest.

At the end, secondLargest will hold the 2nd largest element of the array.

This approach is more efficient in terms of time complexity as it goes through the array once and the time complexity is O(n)

You could also sort the array and return the 2nd last element which is the 2nd largest element or you could use the inbuilt Arrays.sort(arr, Comparator.reverseOrder()) to sort the array in descending order to get the 2nd largest element by getting the element at index 1.