JAVA笔记8__内部类/链表的实现/包装类、享元设计模式/包、访问修饰符

/**
 * 内部类:在一个类的内部中定义的类
 * 1. class Outer{
 *      class Inner{}
 * }
 * 2. class Outer{ //方法内部类
 *      public void doSomething(){
 *          class Inner(){}
 *      }
 * }
 * 2*:1.方法内部类只能在定义该内部类的方法中实例化     
 *     2.方法内部类对象不能使用该内部类所在方法的非final局部变量
 *      (原因:局部变量随着方法调用的结束而消失,而new出来的内部类对象的作用域是可以在方法外的)
 * 3. class Outer{ //静态内部类:没有外部类对象时也能够访问它,且仅能访问外部类的静态成员和方法
 *          static class Inner{} 
 *     }
 *     Outer.Inner n = new Outer.Inner(); 
 */
public class Main {
    public static void main(String[] args) {
        Dog g1 = new Dog(); //产生外部类实例
        Dog.ChildDog cg1 = g1.new ChildDog(); //实例化内部类对象,该方式一般不使用
        g1.say();
        g1.ChildSay();
        cg1.say();
    }
}

class Dog{ //会生成两个class文件
    private String name = "kws";
    public void say(){
        System.out.println("I‘m a Dog, My name is "+name);
    }
    class ChildDog{ //内部类(成员内部类)
        public void say(){
            System.out.println("I‘m a ChildDog, My mom‘s name is "+name);
        }
    }
    public void ChildSay(){
        ChildDog cg1 = new ChildDog();
        cg1.say();
    }
}

 

/**
 * 匿名内部类:没有名字的内部类,有三种
 * 1.继承式
 * 2.接口式
 * 3.参数式
 * 
 * 使用匿名内部类几个原则:
 * 1.不能有构造方法,只能有一个实例
 * 2.不能定义任何静态成员、静态方法
 * 3.不能是public, protected, private, static
 * 4.一定是在new的后面,用其隐含实现一个接口或实现一个类
 * 5.匿名内部类为局部的,所以局部类的所有限制对其生效
 * 
 * 内部类的作用:
 * 每个内部类都能独立地继承自一个(接口)实现,所以无论外部类是否已经继承了某个(接口的)实现,
 * 对于内部类都没有影响。如果没有内部类提供的可以继承多个具体或抽象的类的能力,一些设计与编程问题
 * 就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地
 * 实现了“多重继承”。【JAVA只能是单继承】
 */
public class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog(){ //1.继承式匿名内部类
            public void say(){
                System.out.println("我是一只匿名狗");
            }
        };
        d1.say();
        
        Child d2 = new Child(){ //2.接口式匿名内部类
            public void talk(){
                System.out.println("我是一只继承狗");
            }
        };
        d2.talk();
        
        ChildTalk(new Child(){ //3.参数式匿名内部类
            public void talk(){
                System.out.println("我是一只参数狗");
            }
        });
    }
    public static void ChildTalk(Child c){
        c.talk();
    }
}

class Dog{
    protected String name;
    Dog(){};
    Dog(String name){
        this.name = name;
    }
    public void say(){
        System.out.println("I‘m a Dog, My name is "+name);
    }
}
class maleDog extends Dog{
    public maleDog(String name){
        super(name);
    }
    public void say(){
        System.out.println("I‘m a maleDog, My name is "+name);
    }
}
interface Child{
    public void talk();
}

 

/**
 * 链表的实现
 */
public class Main {
    public static void main(String[] args) {
        NodeManager nm = new NodeManager();
        nm.printNode();
        nm.addNode("node1");
        nm.addNode("node2");
        nm.addNode("node3");
        nm.addNode("node4");
        nm.addNode("node5");
        nm.printNode();
        nm.delNode("node3");
        nm.printNode();
        nm.delNode("node1");
        nm.printNode();
    }
}

class NodeManager{
    private Node root; //根结点
    public void addNode(String name){
        if(root==null){
            root = new Node(name);
        }else{
            root.add(name);
        }
    }
    public void delNode(String name){
        if(root!=null){
            if(root.name.equals(name)){
                root = root.next;
            }else{
                root.del(name);
            }
        }
    }
    public void printNode(){
        if(root!=null){
            System.out.print(root.name+"-->");
            root.print();
        }else{
            System.out.println("NULL");
        }
    }
    class Node{
        private String name;
        private Node next;
        public Node(String name){ this.name = name; }
        public void add(String name){
            if(this.next==null){
                this.next = new Node(name);
            }else{
                this.next.add(name);
            }
        }
        public void del(String name){
            if(this.next!=null){
                if(this.next.name.equals(name)){
                    this.next = this.next.next;
                }else{
                    this.next.del(name);
                }
            }
        }
        public void print(){
            if(this.next!=null){
                System.out.print(this.next.name+"-->");
                this.next.print();
            }else{
                System.out.println("NULL");
            }
        }
    }
}

 

/**
 * 八种基本数据类型的包装类
 * 基本类型      包装类        父类
 * 1.int        Integer      (Number)
 * 2.char       Character    (Object)
 * 3.float      Float        (Number)
 * 4.double     Double       (Number)
 * 5.boolean    Boolean      (Object)
 * 6.byte       Byte         (Number)
 * 7.short      Short        (Number)
 * 8.long       Long         (Number)
 * 
 * 基本数据类型 --> 包装类    :  装箱操作
 * 包装类 --> 基本数据类型    :  拆箱操作
 */
public class Main {
    public static void main(String[] args) {
        Long x1 = new Long(100); //手动装箱
        Long x2 = 100L; //自动装箱
        long x3 = x2; //自动拆箱
        long x4 = x1.longValue(); //手动拆箱
        
        String s1 = "123456";
        int d1 = Integer.parseInt(s1);
        Integer d2 = Integer.valueOf(s1);
        System.out.println(d1+" "+d2);
        
        Integer w1 = new Integer(100);
        Integer w2 = new Integer(100);
        System.out.println(w1==w2); //false
        Integer w3 = -128;
        Integer w4 = -128;
        System.out.println(w3==w4); //true
        //Integer直接赋值时,当值为1个字节以内的数时,将使用同一个对象(-128~127)
        //Byte Short Long Integer 享元设计模式
    }
    
    /**
     * 享元模式:使用共享对象,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似对象;
     * 它适用于大量对象只是重复因而导致无法令人接受的使用大量内存。
     * 通常对象中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
     * #运用共享技术有效的支持大量细粒度的对象【例如游戏中的子弹】
     */
}

 

/**
 * 包:用于对多个java源文件的管理,就像我们的文件目录
 * 定义一个包:package com.vince  【只能出现在代码中的第一句】
 * 运行时必须指定包名   例: java com.vince.Main  或   java com/vince/Main
 * 
 * 访问修饰符
 * 作用域:       同一个类     同包     不同包子类     不同包非子类
 * public          true       true       true           true
 * protected       true       true       true           false  
 * 默认            true       true       false          false
 * private         true       false      false          false
 */

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。