您的位置:首页 > 移动开发 > Objective-C

2017 - 10 -17 面向对象和常见对象 匿名对象 eclipse jar包 debug 常见对象object类

2017-10-18 22:04 561 查看
***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){

97fb

         //但是这里需要改进,根据这里比较的成员变量来决定返回的是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:重写该方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐