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

内部类

  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 权限被保护的 意味着外面的类不能调用这个方法

//演示API
class Student
{
	private String name;
	private int age;
    
	//name
	public 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);//比较的是内存地址--false
		
		System.out.println(s1.equals(s2));//true

		System.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:30

		A.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;//ok

	class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值