20160722(B) 内部类/Object/equal() 比较/(静态)内部类的特点/面试题/局部内部类/匿名内部类/接口的例子/题目

来源:互联网 发布:剑三温柔花哥捏脸数据 编辑:程序博客网 时间:2024/06/06 06:53

内部类

  instanceof 判断一个对象是否属于某个类的实例
  格式:对象 instanceof 类名
  Student
  student

     student instance

interface Animal{public void say();}class Dog implements Animal{  public void say()  {    System.out.println("狗叫");      }    //自己的方法  public void show()  {   System.out.println("狗狗自己的方法");      }}class Cat implements Animal{public void say(){ System.out.println("猫叫");    }}class AnimalPrint{//对动物进行打印public static void print(Animal a){ //System.out.println(a.say());                 a.say();    }}class Eemon1 {public static void main(String[] args) {//狗狗对象Dog dog=new Dog();AnimalPrint(dog);}}

instanceof(实例,运算符) 判断一个对象是否属于某个类的实例

                                                                                           /|\
                                                                                            |
格式:对象 instanceof 类名-------------------------------- --|
Student
student
student instance Student 返回(它是一个运算符)boolean类型 true/false
*/
interface Animal{public void say();}class Dog implements Animal//狗类{  public void say()  {    System.out.println("汪");      }    //自己的方法  public void show()  {   System.out.println("狗狗自己的方法");      }}class Cat implements Animal//猫类{public void say(){ System.out.println("喵");    }}class AnimalPrint{//对动物进行打印public static void print(Animal a)//用接口去接收具体的实现类     { //System.out.println(a.say());                  a.say();                //instanceof  -- a instanceof Dog//判断是否属于狗类 if (a instanceof Dog) {                 Dog dog=(Dog)a;//强行转换成狗的类型(多态的向下转型)//          ----- dog.show(); }  }}class Eemon1 {public static void main(String[] args) {//狗狗对象Dog dog=new Dog();//dog.show();AnimalPrint.print(dog);//猫对象Cat cat=new Cat();AnimalPrint.print(cat);}}
Object

是java当中所有类的父类,也叫根类,就是最大的类
 被默认继承的父类

class Father
  {
    ...
  }


  class Son extends Father
  {
 ...
  }


  **********************************************
  
  toString()


  getClass()  返回字节码描述的类  Class                     class
                                                            // -----
  专门描述对应的对象的字节码


  hashCode()


  clone()   protected 权限被保护的 意味着外面的类不能调用这个方法

//演示APIclass Student{private String name;private int age;    //namepublic String getName(){ return this.name;    }        public void setName(String name)//没有返回值//   ----{  this.name=name;    }    //age    public int getAge(){ return this.age;    }    public void setAge(int age){  this.age=age;    }/*public String toString(){ return "hello";//重写后,输出s和s.toString()都打印hello    }*//*public String toString(){ return "age="+this.age+","+"name="+this.name;    }*/    //受保护,在子类中可以调用    public Object clone()//objcet知道这个对象,但不知道找个对象具体的内容是什么{  Student student=new Student();  student.setAge(this.getAge());  student.setName(this.getName());  //return super.clone();          return student;}}//测试class Eemon2{public static void main(String[] args) {  Student s=new Student();  s.setAge(30);  s.setName("James");      System.out.println(s);//输出:Student@1db9742(十六进制)---------------                    //类名  +@+                                   |    //打印对象时默认使用toString                  |                            //          ----------------                  | //toString                                                       |  System.out.println(s.toString());//<span style="font-family: Arial, Helvetica, sans-serif;">输出:Student@1db9742       </span>//  |                                                                     //   |  //getClass--返回字节码描述的类                                  |  System.out.println(s.getClass().getName());//输出:Student       |               //    ------------                                 |      //   class Student                                  |                                                                   //     |   System.out.println(s.hashCode());//输出;31168322               |                                                                    //    |  System.out.println(Integer.toHexString(s.hashCode()));//1db9742-|                        //将hashcode转换为十六进制的字符  Object s1=s.clone();  System.out.println(s1);//输出:Student@106d69c(返回的是Object,但我们这里是Student)                         //内容一致,但地址有变换  Student s2=(Student)s1;      System.out.println(s2);//<span style="font-family: Arial, Helvetica, sans-serif;">输出:Student@106d69c</span><pre name="code" class="java">      System.out.println(s2.getClass().getName());//输出:Student
System.out.println(s2.getName()); System.out.println(s2.getAge());}}

Object 类中的equal() 比较



  需求:比较两个学生对象的age属性值是否相等,相等返回true,否则返回false--使用equals方法

class Student{private int age;public int getAge(){ return this.age;    }    public void setAge(int age){  this.age=age;    }    public boolean equals(Object obj){  if (!(obj instanceof Student))  {  return false;  } Student s=(Student)obj; return this.age==s.age;    }}      class Dog     {        String name;      }
   class Eemon3    {public static void main(String[] args) {Student s1=new Student();s1.setAge(10);Student s2=new Student();                s2.setAge(10);System.out.println(s1==s2);//比较的是内存地址--falseSystem.out.println(s1.equals(s2));//trueSystem.out.println(s1.equals(new Dog()));//Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Student}}

内部类:

类中定义的类.


   1.成员内部类--定义在成员位置上的类
     特点:a.内部类能直接访问外部类的成员(包括私有的成员)
     b.外部类要调用内部类的成员,只能通过创建对象的方式去调用
class A//外部类{    private int num=10;class B//内部类{      public void showA()  {  int num1=20;              /*class C             {   void showD()   { System.out.println("num1:"+num1);        }             }*/  System.out.println(num);  System.out.println(num1);      }}public void showB(){  new B().showA();    } /*   public void showC(){  new C().showD();    }*/}class Eemon4 {public static void main(String[] args) {A a=new A();System.out.println("___________");a.showB();//10          //20}}

内部类的其它特点:(比较难理解)

     
   需求:在外面的 测试类 中能否直接创建内部类的实例进行操作?
        可以的:
 格式:  外部类.内部类=new 外部类().new 内部类();
              -------------------------------------------------------
这种写法几乎不会用


 条件:内部类不能是私有化的,是public or 默认的


      static的类中只能访问静态的成员,不能被new访问(不需要去new一个实例了)


    2.静态的成员内部类  如何在测试类中实例化(直接new出一个静态的内部类的成员实例)
 格式  外部类.内部类 = new 外部类.内部类();
       -------------
去接收一个对象
class A{   int num1=5;static int num2=10;/*private*/static class B//这里设置了静态,就不能用第一种方法了{public void showA(){  System.out.println("num="+num2);    }}}class Eemon5 //测试类{public static void main(String[] args) {//B b=new B();//类B找不到//b.showA();        //外部类.内部类=new 外部类().new 内部类();//A.B b=new A().new B();//b.showA();A.B b2=new A.B();b2.showA();}}

静态内部类中的成员特点:

    静态内部类中的成员可以有非静态成员吗?可以

class A{static int num1=10;static class B//静态内部类{int num2=20;//非静态成员static int num3=30;//静态成员public void show(){ System.out.println("num1:"+num1); System.out.println("num2:"+num2); System.out.println("num3:"+num3);//非静态的可以去访问那个静态的}        public static void show1(){
                         System.out.println(num1); // System.out.println(num2);//虽然num2在静态类中,但是还是一个非静态的成员,必须通过new对象的方式去调用,"类.方法"的方式        System.out.println(num3);}}}class Eemon6 {public static void main(String[] args) {A.B b=new A.B();b.show();//num1:10                         //num2:20                         //num3:30A.B.show1();//10
                            //30 }}

内部类 面试题:

   
   this.num 这写法就是 当前类的对象


   类.this  这种写法就是"类的this",指定的是这个类的对象

class A{int num=10;class B{int num=20;public void show(){int num=30;//打印30                         System.out.println(num);//打印20                        System.out.println(this.num);//当前类的对象的属性//打印10//System.out.println(new A().num);//创建对象调用System.out.println(A.this.num);//A类对象的num属性    }}}class Eemon7 {public static void main(String[] args) {A.B b=new A().new B();b.show();//30         //20                         //10}}

局部内部类:定义在方法中



   特点:局部内部类可以直接访问自己的内部变量,也可以访问当前方法中的局部变量
   
                  直接访问外部类的成员变量


 外部类$1局部内部类
 外部类$成员内部类(没有匿名)


 Q:局部内部类为什么要多出一个编号?
 A:局部内部类可以有匿名的.

class A{int num=10;//okclass B//成员内部类---A$B.class {int num2=20;//false}public void show(){ int num3=30;//ok class C//局部内部类---A$1C.class { int num4=40;//ok public void say() {  System.out.println("局部内部类say:"+num);     }  }  new C().say();// }}class Eemon8 {public static void main(String[] args) {A a=new A();a.show();}}

 匿名内部类:没有名称的局部内部类

        格式:new 外面的类/接口/外面的抽象类 (){覆盖外面的类方法/实现外面接口的方法/实现外面抽象类的方法}

abstract class A1{public abstract void show1();public abstract void show2();}class A{int num1=10;public void show(){ int num2=20; System.out.println(num2);//20         //匿名内部类--返回的是子类(匿名内部类)的对象--节省空间,提高效率   A1 a1= new A1()//多态向上转型                 //--------------- //拿父类去接受子类的对象 {  public void show1()  {  System.out.println("show1");      }  public void show2()  {  System.out.println("show2");      }     };//这里要";"
               //.show1()可以                    a1.show1();//输出    a1.show2();//输出    }
}class Eemon9 {public static void main(String[] args) {A a=new A();a.show();}}

 接口的例子:



   作业;匿名内部类 普通类的例子

interface Demon{public void show();//}class A{public void show1(){ Demon d= new Demon()  {            public void show(){      System.out.println("匿名内部类接口的例子");//输出}  };                d.show();    }}class Eemon10 {public static void main(String[] args) {A a=new A();a.show1();}}

题目;根据下面的代码写出具体的类和方法

   Outer.method().show();


   Outer.method()--类Outer 里面有method的方法,这个肯定是static


   Outer.method().show();--method()返回的是一个对象,这个对象中必须有show()这个方法


interface Demon{public void show();}class Outer{public static Demon method(){  return new Demon()  {  public void show()  {  System.out.println("爵士");//输出          }           };    }}class Eemon11 {public static void main(String[] args) { Outer.method().show();}}



0 0
原创粉丝点击