72
Nested Classes

Nested Classes. An nested class is a class that is defined inside another class. To this point we have only studied top-level classes. –at most one

  • View
    222

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Nested Classes

Page 2: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Nested Classes

An nested class is a class that is defined inside another class.

To this point we have only studied top-level classes.– at most one public per file– arbitrarily many package-scope per file– either package or public ONLY

Nested classes introduced in jdk1.1

Page 3: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Why use nested classes?

Simplifies many coding tasks– can define small classes on the fly near the

objects created from them + concise syntax– can access outer classes iv’s automatically – no

need to pass a this pointer to the constructor of separate outer class

– can be hidden from other classes in the same package

However, price to pay in terms of complexity, number of gotchas, etc.

Page 4: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Pre jdk1.1

In jdk1.0, the clean and simple class rules were ballyhooed as a major improvement over C++

Addition of inner classes complicates things significantly

However, they do make certain code much less awkard to write, particularly when writing GUIs

Still, you do not have to use them, but they can be quite cool and I do recommend it in moderation!

Page 5: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Types of nested classes

Inner classes – local

• anonymous or named

– non-local• named only

Static nested classes– non-local named only

Page 6: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Non-local inner classes

Simply a nested class that does not have the static attribute and is not defined within a class method.

Can be private, public, package, protected, abstract, etc. just like any class member.

Think of outer class as owning inner class – inner class can only be instantiated via outer class reference (including this)

Inner class has access to all outer class iv’s, private or otherwise!

Page 7: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Simple non-local inner class exampleclass Outer{ private int x1; Outer(int x1){ this.x1 = x1; } public void foo(){ System.out.println(“fooing”);} public class Inner{ private int x1 = 0; void foo(){ System.out.println(“Outer value of x1: “ + Outer.this.x1); System.out.println(“Inner value of x1: “ + this.x1); } }

Page 8: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Simple example, cont -- driver

• Rules for instantiation a little funny

public class TestDrive{ public static void main(String[] args){ Outer outer = new Outer(); // can create in regular way Inner inner = outer.new Inner(); //must call new through //outer object handle inner.foo(); // note that this can only be done if inner is visible // according to the regular scoping rules }}

Page 9: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Inner class rules

Note that inner class can access outer class instance variables (even private ones).

It does this using the object reference <OuterClassName>.this

Refer to public inner class as <OuterClassName>.<InnerClassName>

Page 10: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

When to use non-local inner classes Most typically used when inner class is

instantiated from outer class. If classes naturally “belong together”, it is

cumbersome to pass a this pointer to a separate outer class just so second class can access first class’s properties/methods.

Note that inner class can access outer class’s private data, making them even more powerful than mechanism implied above!

Page 11: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Local inner classes

Inner classes may also be defined within class methods.

These are called local inner classes. Principle advantage is scoping: such classes are

completely inaccessible anywhere but the method itself where they are defined.

Thus, they have no visibility attribute (public, etc.) Also, can NOT access local variables other than

those declared with final attribute.

Page 12: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Local anonymous inner classes

Local inner classes can be taken a step further – it is not required to give them an explicit name.

This is very convenient when you want to use a class only once and the code that it contains is succinct.

Great example is defining Swing callback functions.

Page 13: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Anonymous class examplebut.addActionListener( new ActionListener(){ public void actionPerformed(actionEvent ae){ //do work here } });

Page 14: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Very Basic Applets

Programs that run within web browsers

Page 15: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What are applets?

Applets are simply java programs that run in web browsers.

Created a big stir in mid-90’s when Netscape agreed to embed jvm in Navigator web browswer.

Great promise – applications automatically distributed to anyone on any platform!

Reality – non-uniform browswer support, limitations imposed by security, easier ways to accomplish same thing!

Page 16: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What are applets, cont. Still useful in just the right situation

– fancy, full-fledged client– can make some assumptions/have some control over

client technology Also, very good for understanding issues in web

client-server programming Otherwise, server-heavy programming with html

or client-side scripting wins out. Also, Java WebStart new alternative

– can launch full applications remotely without need for host browser

Page 17: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Applet inheritance treeObject

Component

Container

Window

Frame

JFrame

Panel

Applet

JAppletUse to access

Swing Components

Page 18: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Some Hello World Applets

To see how applets work, we start with a couple of versions of a HelloWorld program– One uses the fact that an Applet is a Panel with

a graphics object– The other uses a button label

Soon, we will add full event-handling capabilities and nice graphics. This is just a start.

Page 19: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

HelloWorldApplet1

import java.awt.*;import javax.swing.*;

public class HelloWorldApplet1 extends JApplet{ public void init(){ getContentPane().add(new JLabel( “Hello World”, SwingConstants.CENTER)); }}

• Note that all Applets are class that extend either Applet or JApplet• init() is called when the Applet is loaded

Page 20: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

HelloWorldApplet2

import java.awt.*;import javax.swing.*;

public class HelloWorldApplet1 extends JApplet{ public void painComponent(Graphics g){ g.drawString(“Hello World”, 50, 50); }}

• Since Applets are Panels, we can override PaintComponent and get a Graphics Object• This will become particularly handy when doing animations

Page 21: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Running Applets To run applets, do the following:

– Compile class file in regular way– Create an html file that includes an applet tag pointing to

the applet <applet code = “Appletname.class” width = 200 height = 50></applet>

(width and height are pixel coords)

– Invoke browser or appletviewer on html file Note that applet tag can include other parameters,

some of which of used by browser automatically (e.g. width).

Also, Java2 plug-in required for browsers to support applets. Good to test with appletviewer first.

Page 22: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Life Cycle of Applet

To write more sophisticated applets, a number of other methods may need to be overwritten. – void init()– void start()– void stop()– void destroy()

We discuss the role of each next.

Page 23: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

init() method The browswer calls the init method when the applet is

loaded for the first time. init() behaves much like a constructor. Typical uses:

– parsing param values from html files– opening streams and sockets– creating GUI components– opening database connections

Important: note that the refresh button doesn’t necessarily reload applet. This is browser-dependent. To guarantee reloading, browser needs to be killed and restarted.

Page 24: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

start() method

called every time page is located– this can mean moving off and back onto page, hitting

reload, etc.

always called after init() when page is first loaded. Typical uses:

– starting animations

– anything else that needs to start anew with every location of applet

– for simpler things this method can be ignored

Page 25: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

stop() method

called whenever user moves off the page where applet sits

always called after start typical uses

– ending animations– stopping other time-consuming system activity

often ignore this for simpler applets

Page 26: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

destroy() method

called once when browser shuts down normally

always called after stop() typical uses:

– close database connections– close streams– clean up any other resources

often ignored for simpler applets

Page 27: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

More on applet life-cycle

It’s very import to be aware that some other software, ie the host browser, is calling these methods at certain times.

You the program do not call these methods. This is classic OO framework: “don’t call us,

we’ll call you”. You write the class and specialize certain

methods, some other code calls your custorm versions of those methods at specified times.

Page 28: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Other applet issues

Security– Horstmann pg. 499

Pop-up windows– Horstmann pg. 500

Applet tags and attributes– Horstmann pg. 502

Passing info to applets– Horstmann pg. 506

Applets making socket connections

Page 29: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Part 2

Extending Web Server Functionality

Servlets and JSP

Page 30: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Web Servers

A server program that listens on a standard port and handles http protocol.

Http protocol consists mainly of requests for documents

Documents are typically html files Two most important http protocol elements:

– GET (request document, may upload data)

– POST (request document, upload data).

This protocol is hidden from you by browser.

Page 31: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Early Web Servers

Earliest web sites were static:– Browser requests page

– Server hands over page

CGI (Common Gateway Interface) scripts defined a standard for extending functionality – http GET/POST data could be passed to and processed

in separate function (C, Perl, Python, etc.)

– This often included call to back-end database and response to user via modified html document

Page 32: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Shortcomings of CGI

E-Commerce became more popular and web sites became more heavily used. This brought to the fore some shortcomings of CGI:– New process spawned for every hit – not

scalable– No concept of sesssion or state– Pretty low level– Security risks (C in particular)

Page 33: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Servlets

Java’s answer to CGI, very simple, high-level

Requirements: a servlet-enabled web server When specified by your web page, web

page passes http requests to java method (assuming everything is setup properly)

Servlet method then has access to all of Java capabilities – jdbc very important here.

Servlet then writes html back to user.

Page 34: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Servlets, cont.

Important: a web server takes care of all interactions with the servlet – servlet extends functionality.

On the client side, servlet pages are typically requested in one of two ways:– As a regular URL address– As a link in a regular html document

Details are server-dependent

Page 35: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Writing servlets

All servlets extend the Servlet class. All http servlets (by far most typical) should

extend the HttpServlet class. In extending HttpServlet, you typically

override the following methods:– init, doGet,doPost, destroy (very common)– doPut, doDelete, doOptions, doTrace (rare)

Page 36: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Main HttpServlet Methods

init() – called once when servlet is loaded by server.

Contains any initializations that are common to all requests.

doGet(HttpServletRequest, HttpServletResponse) – Called each time the servlet receives an http

GET request posted by a client. Passes two objects, one representing the information of the request, the other used to configure a response.

Page 37: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Main HttpServlet Methods, cont.

doPost(HttpServletRequest, HttpServletResponse)

– Same as doGet but for an http POST request.

destroy()– Called before servlet is unloaded from memory.

Performs any final cleanup, freeing memory, closing connections, etc.

Page 38: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Service Method

Important: The method service(HttpServletRequest, HttpServletResponse)

is also called for each servlet invocation. Service() in turn calls doGet and doPost,

etc. It is best not to override service even if you

want to handle doGet and doPost identically. Simply have one call the other.

Page 39: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

HttpServletRequest Object

Passed when browser calls doGet and doPost. Most import methods for beginning servlet

programming– getParameter(String paramName)

– getParameterNames()

– getParameterValues()

Makes getting data from web pages very simple. Many other methods for images, cookies, etc.

Page 40: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

HttpServletResponse Object

Passed when browser calls doGet or doPost Most import methods for beginning servlet

programming:– getWriter();

• Get Writer for communicating back to client

– setContentType(String); • Typically use “text/html”, indicating that html will

be sent back to the browser

Page 41: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Examples

Use html form to connect to servlet, accept form data, and then echo it back with the output stream.

Postdata.java : Java servlet Form.html : HTML front-end Basic steps very simple – just need to

know a little HTML and a few Java methods

Page 42: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

General Comments

Recall that each request for a servlet gets its own thread but access the same methods. Thus, synchronization issues arise.

Page 43: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Final Exam Review Questions

Page 44: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question0

class A { static void display ( ){ System.out.println ( "Class A" ) ; }} class B extends A { static void display ( ) { System.out.println ( "Class B" ); }}When we create an object and call the display ( ) method as:. A aa = new B() ;aa.display ( )

What is displayed ?? What if display is non-static??

Page 45: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question1 Given a class A with a protected iv ivp, which of

the following are possible ways of accessing ivp?1. using the this pointer within a subclass of A within

the same package2. using the this pointer within a subclass of B outside

of the package3. using an instance of A from within any class in the

same package4. using an instance of A from within any class5. using an instance of A from within any class in the

CLASSPATH

Page 46: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question2 Given a class A with a private iv ivp, which of the

following are possible ways of accessing ivp?1. using the this pointer within a subclass of A within

the same package2. using the this pointer within a subclass of B outside

of the package3. using an instance of A from within any class in the

same package4. using an instance of A from within any class5. using an instance of A from within any class in the

CLASSPATH

Page 47: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question3

List the visibility keywords in order of most to least restrictive.

1. private default protected public

2. public protected default private

3. private protected default public

4. public default private protected

Page 48: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question4

If an iv has private scope in some superclass, then no subclass can access the iv using the this pointer.

Page 49: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question5

Immutable classes may contain accessor methods

Page 50: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question6

Immutable classes are Threadsafe.

Page 51: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question7

class X{ public boolean equals(Object o){ X anX = (X) o; if (anX.iv1 == this.iv1) return true; return false; }

? int iv1; What can be inferred about iv1?private, protected, default, public, all, some??

Page 52: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question8-10

Assuming the class X is exactly as it appears on the previous slide (with public in place of ?), is the following valid?

X x2 = (X) anX.clone(); If so, is this clone and adequate clone? If

not, how would you modify the class X to make it cloneable?

Is X serializable as-is?

Page 53: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question11

Is it appropriate to store anX in HashMap, again assuming that X is defined verbatim as you see?

Is it legal to store anX in a HashMap?

Page 54: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question12

Is it possible for a subclass to override a private superclass method?

Page 55: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question13

Can a static variable be used in a non-static context?

Page 56: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question14

Can a static method access a non-static variable?

Page 57: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question15

Can a class with all static methods be instantiated?

Page 58: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Questions16-18public class ClassA { public void methodOne(int i) { } public void methodTwo(int i) { } public static void methodThree(int i) { } public static void methodFour(int i) { } } public class ClassB extends ClassA { public static void methodOne(int i) { } public void methodTwo(int i) { } public void methodThree(int i) { } public static void methodFour(int i) { } } a. Which method overrides a method in the superclass?b. Which method hides a method in the superclass?c. What do the other methods do?

Page 59: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question19-24 Exception handling (T or F) All java Exceptions must either be caught or

thrown. Classes can throw Exceptions. Static methods can throw Exceptions. main can be declared to throw Exception rethrowing Exceptions is bad programming style Every method that throws an Exception should be

placed in its own try-catch block It is bad programming style to have empty catch

blocks, at least in production code.

Page 60: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question25

Which best describes and Applet?

1. A thin client

2. A fat client

3. A lightweight web server

4. A full-blown application server

Page 61: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question 26-31 All applets extend either Applet or JApplet. Applets need a main method to run All applets must override at least the start, stop,

init, and destroy methods. start, stop, init, and destroy methods are declared

abstract in the Applet class Unsigned applets cannot make socket connections

to any server. Unsigned applets cannot access files on the local

directory

Page 62: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Somewhat irritating certification type questions

Page 63: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Question 1)Which of the following lines will compile without warning or error?1) float f=1.3; 2) char c="a"; 3) byte b=257; 4) boolean b=null; 5) int i=10;  

Page 64: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will happen if you try to compile and run the following code public class MyClass {public static void main(String arguments[]) { amethod(arguments);}public void amethod(String[] arguments) {System.out.println(arguments);System.out.println(arguments[1]);}}1) error Can't make static reference to void amethod. 2) error method main not correct 3) error array must include parameter 4) amethod must be declared with String

Page 65: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Which of the following will compile without error 1) import java.awt.*;package Mypackage;class Myclass {} 2) package MyPackage;import java.awt.*;class MyClass{} 3) /*This is a comment */package MyPackage;import java.awt.*;class MyClass{}  

Page 66: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will happen when you compile and run the following code?   public class MyClass{ static int i; public static void main(String argv[]){ System.out.println(i);}}

1) Error Variable i may not have been initialized 2) null 3) 1 4) 0

Page 67: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will be the result of attempting to compile and run the following code? abstract class MineBase { abstract void amethod(); static int i;}public class Mine extends MineBase {public static void main(String argv[]){ int[] ar=new int[5]; for(i=0;i < ar.length;i++) System.out.println(ar[i]);}} 1) a sequence of 5 0's will be printed 2) Error: ar is used before it is initialized 3) Error Mine must be declared abstract 4) IndexOutOfBoundes Error

Page 68: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will be printed out if you attempt to compile and run the following code ? int i=1;switch (i) {case 0:System.out.println("zero");break;case 1:System.out.println("one");case 2:System.out.println("two");default:System.out.println("default");} 1) one 2) one, default 3) one, two, default 4) default

Page 69: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

Which of the following statements are true? 1) Methods cannot be overriden to be more private

2) Static methods cannot be overloaded3) Private methods cannot be overloaded4) An overloaded method cannot throw exceptions

not checked in the base class

Page 70: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will happen if you attempt to compile and run the following code? class Base {}class Sub extends Base {}class Sub2 extends Base {}public class CEx{public static void main(String argv[]){Base b=new Base();Sub s=(Sub) b;}}1) Compile and run without error 2) Compile time Exception 3) Runtime Exception  

Page 71: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will happen when you attempt to compile and run the following code?. class Background implements Runnable{int i=0;public int run(){while(true){i++;System.out.println("i="+i);} //End whilereturn 1;}//End run}//End class

1) It will compile and the run method will print out the increasing value of i. 2) It will compile and calling start will print out the increasing value of i. 3) The code will cause an error at compile time. 4) Compilation will cause an error because while cannot take

a parameter of true.

Page 72: Nested Classes.  An nested class is a class that is defined inside another class.  To this point we have only studied top-level classes. –at most one

What will be the result when you try to compile and run the following code? private class Base{Base(){ int i = 100; System.out.println(i);}}

public class Pri extends Base{ static int i = 200; public static void main(String argv[]){ Pri p = new Pri(); System.out.println(i);}}

1) Error at compile time 2) 200 3) 100 followed by 200 4) 100