2017

来源:互联网 发布:mac用minila 编辑:程序博客网 时间:2024/05/01 02:48
***1 匿名内部类
    就是内部类的简化写法
  前提:
     存在一个类或者接口
     这里的类可以是具体类也可以是抽象类
  格式:
      new 类名或者接口名(){
             重写方法;
    }
 
   本质是什么呢?
      是一个继承了该类或者实现了该接口的子类匿名对象
  interface Inter{
         public abstract void show();
         public abstract void show2();
}

   class Outer{
        public void method(){
           //一个方法的时候
           /*
           new Inter(){
              public void show(){
                  System.out.println("show");
                   }
           }.show();
            */    
           //两个方法的时候
           /*
           new Inter(){
              public void show(){
                  System.out.println("show");
                   }
              public void show2(){
                  System.out.println("show2");
                   }
           }.show();

           new Inter(){
              public void show(){
                  System.out.println("show");
                   }
              public void show2(){
                  System.out.println("show2");
                   }
           }.show2();
           */
   
           //如果我们有很多个方法,那就很麻烦了
           //那么,有没有什么改进的方案?
           Inter i = new Inter(){  //多态
              public void show(){
                  System.out.println("show");
                   }
              public void show2(){
                  System.out.println("show2");
                   }
           };
            i.show();
            i.show2();
     }
}

 class InnerClassDemo{
        public static void main(String[] args){
                Outer o = new Outer();
                o.method();
         }
}

2 匿名内部类在开发中的使用
//用完之后就是垃圾,可以被回收,所以在安卓中用的多,手机内存小,而EE用的少。

interface Person{
    public abstract void study();
}

class PersonDemo{
     //接口名作为形式参数
     //其实这里需要的不是接口,而是该接口的实现类的对象
      public void method(Person p){
                 p.study();
      }
}

 //实现类
class Student implements Person{
         public void study(){
            System.out.println("好好学习,天天向上");
      }
}

class InnerClassTest2{
       public static void main(String[] args){
          //测试
       PersonDemo pd = new PersonDemo();
       Person p = new Student();
       pd.method(p);
       System.out.println("------------------");
     
       //匿名内部类在开发中的使用
       //匿名内部类的本质是继承类或者实现了接口的子类匿名对象
       pd.method(new Person(){
           public void study(){
             System.out.println("好好学习,天天向上");
                   }
          });
    }
}

***3 匿名内部类的面试题
     按照要求补齐代码
        Interface Inter{ void show(); }
        class Outer {// 补齐代码 }
        class OuterDemo{
            public static void main(String[] args){
                      Outer.method().show();
}
         要求在控制台输出"HelloWorld"
---------------------------------
Interface Inter{ 
        void show(); 
}
class Outer{
    //补齐代码 
    public static Inter method(){
              //子类对象 -- 子类匿名对象
              return new Inter(){
                   public void show(){
                      System.out.println("HelloWorld");
                  }
         };
   }
}
class OuterDemo{
            public static void main(String[] args){
                      Outer.method().show();
                /*  
                   1:Outer.method() 可以看出method()应该是Outer中的一个静态方法。
                   2:Outer.method().show()可以看出method()方法的返回值是一个对象
                     又由于接口Inner中有一个show()方法,所以我认为method()方法返回的是一个接口。
      }
}

4  eclipse
(1) 自动生成构造方法,自动生成get/set方法

自动生成构造方法
a:无参构造方法 在代码区域右键--source--Generate Constructors from Superclass
b:带参构造方法 在代码区域右键--source--Generate Constructors using fields.. -- finish

自动生成get/set方法
在代码区域右键--source--Generate Getters and Setters...

(2)  继承抽象类或者实现接口的简化
       通过eclipse 一键简化 重写 父类抽象方法   

     @Override
     这个注解的意思是说,这个方式是重写父类的
     如果和父类名出线了偏差,就会报错。

5 jar包
(1)jar包就是多个class文件的压缩包
(2)jar包有什么用?用别人写好的东西
(3)如何打jar包? 选中项目--右键--Export--Java--Jar--自己指定一个路径和一个名称--Finish
(4)使用jar包  复制到项目路径下并添加至构建路径
(5)生成说明书。。。选中项目--右键--Export--Java--Javadoc—Finish
(6)修改项目问题
      不要随意修改项目名称
      如果真要修改,不要忘记了配置文件.project中的
      <name>把这里改为你改后的名称</name>

6 Debug调试
(1)作用:
    调试程序
    查看程序执行流程
(2)如何查看程序执行流程
    要想看程序流程,就必须设置断点
(3)什么是断点:
       就是一个标记,从哪里开始
(4)如何设置断点:
       你想看哪里的程序,就在那个有效程序的左边双击即可
(5)在哪里设置断点:
       哪里不会点哪里。
(6)如何运行:
       在代码区域--右键--Debug as--Java Appliaction
       弹出一个界面:问你是否需要打开断点界面。并问你是否需要记录。
       是(Yes),是(选中复选框)。
(7)看哪些地方:
       Debug:断点测试的地方
           在这个地方,记住F6,或者点击start off也行
       Variables:查看程序的变量变化
       ForDemo:被查看的源文件
       Console:控制台
(8)如何去断点:
      a:再次双击即可
      b:找到Debug视图,variable界面,找到Breakpoints,并点击,然后看到所有断点,点击双叉(remove all)

7 常见对象
  API 应用程序编程接口
  Java API就是java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用就行。

8 Object类
(1)Object类 是类层次结构的根类,每个类都是用Object 作为超类
      每个类都直接或间接的继承自Object类
(2)构造方法
    public Object()
    回想面向对象为什么说:
         子类的构造方法默认访问的是父类的无参构造方法?
      因为Object 只有一个无参构造方法
(3)public int hashCode()
        A:返回该对象的哈希码值
        B:注意:哈希值是根据哈希算法计算出来的一个值,这个值根地址值有关,但是不是实际地址值。你可以理解为地址值。
        Studnet s1 = new Student();
        Sytem.out.println(s1.hashCode());//11299397
        Studnet s2 = new Student();
        Sytem.out.println(s2.hashCode());//24446859
        Studnet s3 = s1;
        Sytem.out.println(s3.hashCode());//11299397
(4)public final Class getClass()
        A:返回此Object 的运行时类
        B:Class类的方法: public String getName():以String的形式返回此class对象所表示的实体
        Student s = new Student();
        Class c = s.getClass();
        String str = c.getName();
        Systm.out.println(str);// cn.itcast_01.Student  包名及其类名
        --------链式编程
        String str2 = s.getClass().getName();
        Systm.out.println(str2);// cn.itcast_01.Student
**(5)public String toString()
        A:返回该对象的字符串表示
        B:方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
        //即等价于getClass().getName() + '@'+Integer.toHexString(hashCode())
        //this.getClass().getName() + '@'+Integer.toHexString(hashCode())

        Student s = new Student();
        System.out.println(s.toString());// cn.itcast_02.Student@42552c
----------------------------------------
a:Integer类下的一个静态方法:
          public static String toHexString(int i);把一个整数转成一个十六进制表示的字符串
        
b:这个信息的组成了解了,但是这个信息是没有任何意义的,所以,建议所有子类都重写该方法。
        怎么重写呢?
        把该类的所有成员变量值组成返回即可
        @Override
         public String toString(){
                return "姓名:"+name+",年龄"+age;
}
 
        重写的最终版方案就是自动生成toString()方法。
c:注意:
     直接输出一个对象的名称,其实就是调用该对象的toString()方法
     System.out.println(s.toString());//Student{name=null,age=0}
     System.out.println(s);//Student{name=null,age=0}
***(6)public boolean equals(Object obj);
       A:指示其他某个对象是否与此对象“相等”。
       B:==: 
           基本类型:比较的就是指是否相同
           引用类型:比较的就是地址值是否相同
       C:默认比较的是地址值         
       Student s1 = new Student("小林",7);
       Student s2 = new Student("小林",7);
       Student s3= s1;
       System.out.println(s1.equals(s2));//false
       System.out.println(s1.equals(s1));//true
       System.out.println(s1.equals(s3));//true

       D:@Override
         public boolean equals(Object obj){
         //但是这里需要改进,根据这里比较的成员变量来决定返回的是true还是false
         //这里其实要比较的就是name和age
         //但是,name是String类型的,而String是引用类型的,所以,在这里不能直接用==比较,应该用equals()比较
         //String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同
         //this ---s1
         //obj ---s2
         //我们要使用的是学生类的特有成员变量,所以要向下转型
         Student s = (Student)obj;// s---obj---s2
         if(this.name.equals(s.name)&&this.age ==s.age){
              return true;
        }else{
              return false;
          }
   }
}

(7) protected void finalize() 和 protected Object clone()
A:protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法-----------用于垃圾回收,但是什么时候回收不确定。-----了解一下
B:protected Object clone():创建并返回此对象的一个副本-------了解
           A:重写该方法
原创粉丝点击