黑马程序员_Java基础[17]_Object、内部类

---------- android培训 java培训、期待与您交流! ----------

【【Object】】类

/*

 *是所有类直接或者间接的父类       (超类    (最上层的类。
 *该类中定义的肯定是所有对象都具备的功能
 *        (所有对象都具备比较功能。
 *
 *Object类中已经提供了对对象是否相同的比较方法
 *
 *如果自定义类中也有比较相同功能,没有必要自己再定义
 *只要沿袭父类中的功能,建立自己特有的比较内容即可,这就是覆盖/复写。
 *
 *【应用技能】
 *1、向下转型,
 *2、instanceof 类型比较关键字
 *3、方法的复写/覆盖
 *4、多态
 *5、equals
 *6、toString()hashCode() 哈希值
 */
class Demo_a {   //extend Object {
    public int num;
    Demo_a(int num){
        this.num=num;
    }

    public boolean equals(Object obj){//Object obj=new Dem();  //复写    方法一模一样
        /*针对传入不同类型比较时,必然是false
         */
        if(!(obj instanceof Demo)){//类型比较 ,instanceof关键字。
            return false;    //不是同一个类型直接返回:
        }
        Demo_a  de=(Demo_a )obj;
        return this.num==de.num;
        /*
         *个人总结在多态中,可以通过向下转换/强制转换的方式,使父类拥有子类的成员变量和方法。
         *就比较而言,想比较其他的,而这些功能父类已经定义了,子类只需要覆盖就可以,
         *        在这里只需要对传入的类型进行判断,然后进行向下转换即可完成功能。

         */
    }
    //public boolean equals(Demo d ){ //重载 参数列表不同
    //}
}
class Person_a{
    //建立一个人的类,也可以传入复写的比较方法中比较,只不过不同类型,必然是false;
}


public class Demo_Object {

    public static void main(String []args){
        //1 【equals】 任何对象都具备比较的功能。
        /*
        Demo d1=new Demo();
        Demo d2=new Demo();
        Demo d3=d1;
        System.out.println(d1.equals(d3));
        System.out.println(d1==d2);
        System.out.println(d1==d3);
        */
        /*
         * d1d2d3都指向一个地址,进行比较的时候,equals比较的是对象的值
         * 而==是比较的是地址
         */
        Demo_a d1=new Demo_a(4);
        Demo_a d2=new Demo_a(6);
        System.out.println(d1.equals(d2));
        //[toString]
        System.out.println(d1.toString());//打印的是该对象的哈希值。
        
    }
}
/*API里面:
 * boolean  |||||||         equals(Object obj)
 */

-----------------------------------------------------------------------------------------------------------------

【内部类】

 * 【内部类】
 *1、将一个类定义在另外一个类里面,对立面那个类就称为内部类(内置类,嵌套类)
 *2、访问特点:
 *    2.1、内部类可以直接访问外部类中的成员、私有成员
 *        之所以可以直接访问外部类中的成员,是因为内部类中持有一个外部类的引用,格式:   外部类名.this    具体看【a】
 *    2.2、外部类要访问内部类中的成员必须要建立内部类对象。
 *内部类是属于外部类的成员变量,是可以私有化的
 *
 *【1,内部类在main方法中格式,2内部类为什么可以直接访问外部类】
 *访问格式:
 *1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。
 *    格式:外部名.内部类名   变量名=new 外部类对象().new 内部类对象();
 *          Outer.Inner in=new Outer().new Inner();
 *
 *2、当内部类在成员位置上,就可以被成员修饰符所修饰。
 *    比如,private 将内部类在外部类中进行封装
 *         static :内部类就具备了static的特性;
 *          当内部类被static修饰后,只能访问外部类中的static成员,出现了局限性。
 *
 *          在外部类中,如何直接访问内部类的非静态成员呢?
 *         new Outer.Inner().Function();
 *
 *          在外部类中,如何直接访问内部类的静态成员呢?
 *         new Outer.Inner.Function2();
 *注意:当内部类中定义了静态成员,该内部类必须是static的。
 *        当外部类中的静态方法访问内部类时,内部类也必须是静态的。
【b】
 *【b】
 *在定义一个内部类:
 *
 *当描述事物时,事物的内部还有事物,该事物用内部类来描述,
 *因为内部事物在使用外部事物的内容。
 *
 *包含关系的时候就使用内部类。
 *【c】
 *内部类可以写在外部类的任意位置;【成员】或者【局部】。
 *【c】中属于局部内部类,但是访问规则没有改变,
 *        该类不能在被static修饰,因为static只修饰成员变量不能修饰局部成员
 *内部类定义在局部时
 *1,不可以被成员修饰符修饰
 *2,可以直接访问外部类中的成员变量,因为还持有外部类中的引用
 *    但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
 *静态内部类出现的并不多
 */
class Outer{
    int x=3;
    //class Inner{  //内部类
    static class Inner{  //静态内部类
        int x=4;
        void Funtion(){
            int x=5;
            //内部类使用外部类成员和方法,可以直接调用
            System.out.println("内部类成员变量:"+this.x);
            System.out.println("内部类局部变量:"+x);
            //当内部类定义为静态内部类的时候,非静态的变量就不能访问了
            //System.out.println("外部类成员变量:"+Outer.this.x);
            //注意看上面的结果,有3个x成员的值得【a】
        }
        static void funtion2(){
             System.out.println("funtion2");
         }
    }
    void method(){
        System.out.println("show   "+x);
        //外部类使用内部类成员和功能 必须创建内部类对象
        Inner in=new Inner();
        in.Funtion();
    }

    
//【b】又一个内部类:
    class Inner2{
        void show(){
             System.out.println("inner222");
            }
        }
    public static void method2(){
        Inner.funtion2();
        //new Inner2().show();
        /*发现,该静态方法调用静态内部类可以编译
         * 而调用非静态内部类编译出错。

         *
         */
    }
    //【c】
    //void method3(int a){  【mm】对应下列【mm】
    void method3(final int a){
        int x=3;
        final int y=4;
        class Inner3{
            void function3(){
                //System.out.println(x);  //不能访问该类所在的局部的变量
                System.out.println(y);    //而只能访问局部中final修饰的变量
                System.out.println(a);    //传入int a是编译错误,传入final 修饰的才可以通过【mm】
                System.out.println("该内部类属于局部内部类,但是访问规则没有改变。" +
                        "该类不能在被static修饰因为static只修饰成员变量不能修饰局部成员");

            }
        }
        new Inner3().function3();
    }

}




public class Demo_Neibulei {

    
    public static void main(String[] args) {
        
        //Outer ou=new Outer();
        //ou.method();
        //面试时候用:内部类想要在main方法中创建对象格式:
        //Outer.Inner in=new Outer().new Inner();
        //in.Funtion();

        
        //使用很少,面试可能出现。
         // 在外部类中,如何直接访问静态内部类非静态成员呢?
        new Outer.Inner().Funtion();
         // 在外部类中,如何直接访问静态内部类静态成员呢?
        Outer.Inner.funtion2();
    }

}







---------- android培训、 java培训、期待与您交流!----------
黑马官网: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值