Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
2A. MORE OOP IN JAVA REFERENCE: HTTP://DOCS.ORACLE.COM/JAVASE/TUTORIAL/JAVA/JAVAOO/ACCESSCONTROL.HTML PUBLIC / PRIVATE / PROTECTED • A way to control who can access parts of the class • Why? • • • • Good Design* A way to "bullet-proof" your code. Can make it easier to modify your code. Jason says so • It'll be a bit aggravating at first… • Basic idea: • Put a modifier in front of a "thing" • • • • An attribute (variable) A method (function) A nested class … • 4 modifiers: public, private, protected, [no modifier = packageprivate]. • 4 contexts: in-class, in-package, in-subclass, world NESTED CLASSES • Basically a class within a class. • Why? • Organization / Readability: we don't have to look in 2+ files. • Of course…that one file can get really crowded… • Encapsulation: We can hide the nested class from users of the outer class (if we choose) package nestedexample; public class Outer { private class Inner { private float y; Inner(float b) { y = b; } public String blah() { return "Bl_" + y + "_ah"; } } private Inner x; public Outer(float c) { x = new Inner(c); } public void test() { System.out.println("Te_" + x.blah() + "_st"); } public static void main(String[] args) { Outer o = new Outer(3.2f); o.test(); } } NESTED CLASS EXAMPLE CONTEXT EXAMPLES // TheClass.java package accessexample; // OtherClass.java package accessexample; public class TheClass { public class OtherClass { In-class Inpackage } import accessexample.*; public class TestApp { public static void main(String[] args) { World } } } // OtherClass.java import accessexample.TheClass; public class OtherClass extends TheClass { In-subclass } This is the class of interest ACCESS RULES Can access? Modifier In-class In-package In-Subclass World public Y Y Y Y protected Y Y Y N no modifier (packageprivate) Y Y N N private Y N N N • [Do some examples within the classes on the last slide] 2B. LINKED STRUCTURES http://testplant.blogspot.com/2011_08_01_archive.html OVERVIEW • What are they? • Comparisons to arrays • • • • Heterogeneous vs. Homogeneous Structure Operations: add, get, remove, iteration Efficiency: • Time efficiency • Memory efficiency • Usage in other algorithms / data structures REFERENCES (AND POINTERS) • "basic" types vs. objects • And the "class-wrapped" version of basic types • use of new • Simple Example: REFERENCE EXAMPLE public static void test1(int x) { x = 10; } public static void main(String[] args) { int a = 5; test1(a); System.out.println("a = " + a); } REFERENCE EXAMPLE, CONT. public static void test2(int[] xL) { xL = new int[xL.length * 2]; for (int i = 0; i < xL.length; i++) xL[i] = 10; } // Try it with and without this... public static void print_array(String name, int[] L) { System.out.print(name + " = ["); for (int i = 0; i < L.length; i++) { if (i == 0) System.out.print(L[0]); else System.out.print(", " + L[i]); } System.out.println("]"); } public static void main(String[] args) { int[] b = new int[3]; b[0] = b[1] = b[2] = 5; test2(b); print_array("b", b); int[] c = b; c[0] = 99; print_array("c", c); print_array("b", b); } Do a memory diagram… REFERENCES AND POINTERS • A Java reference is like a C/C++ pointer • (behind the scenes it likely is a C pointer) • Differences • Memory management (at least free / delete) • More type safety • Almost every variable in Java is a reference except: • basic types (int, double, boolean) • String • …(there might be some more I'm not aware of ) BASIC STRUCTURE OF A LINKED LIST • The linked list is made of Nodes. Each node contains: • A payload: The actual value we're storing • A next reference (null if this is the last) • [A prev reference] (for a doubly-linked list) • The LinkedList itself contains: • The size of the list • We didn't need to store this in the IntList class – why here? • A reference to the head of the list (or null if empty) • [A reference to the tail of the list (or null if empty) TRAVERSING A LINKED LIST • Makes heavy use of references. • Pseudo-code Node temp = mHead; // Note NOT new while (temp != null) { // Do any operations / tests on temp // Move to the next node temp = temp.mNext; } ADDING TO A LINKED LIST • Two major variants: • At to end (or beginning) • Add in order • In all cases, we create a new Node (newN) • Cases: • Empty list • set mHead (and mTail?) to newN • Non-empty list, inserting at head (tail) • Make newN point to the old head (tail) • Update mHead (and / or mTail) • Non-empty list, inserting elsewhere: • Traversal until we reach the "right" spot • Make temp.mNext point to newN REMOVING ELEMENTS FROM A LINKED LIST. • Do a traversal to find the targetNode • Cases: • Empty list • This is the same node as that pointed to by mHead or mTail • This is a node in the middle of the list • Do pseudo-code (& diagram) on board. BUILT-IN LINKED LISTS LinkedList L = new LinkedList(); L.add("abc"); L.add(15); L.add(3.719); Iterator I = L.iterator(); while (I.hasNext()) { Object curValue = I.next(); System.out.println(curValue); } OTHER USES FOR LINKED LISTS • Both (can) use a LinkedList implementation • We just have a more limited form of adding / removing. • Queues • FIFO (First-in-first-out) • Only add (push) to the tail and remove (pop) from the head. • Uses: • As a tool in our path-finding (breadth-first search) of a graph. • Stack • LIFO (Last-in-first-out) • Only add (push) to the tail and remove (pop) from the tail (or vice-versa). • Uses: • To optimize recursive functions. • To do a depth-first traversal of a tree.