黑马程序员----2015.6.16笔记(多态,接口,Object,内部类,匿名类,异常,throws)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.多态:可以理解为事物存在的多种体现形态
            a.多态的体现
                父类的引用指向了自己子类对象
                即父类的引用也可以接收自己的子类的对象
            b.多态的前提
                必须是类与类之间有关系,要么是继承,要么是实现
                通常还有一个前提:存在覆盖
            c.多态的好处
                大大的提高了程序的扩展性
            d.多态的应用
            
            e.多态的弊端
                提高了扩展性,但是只能使用父类的引用访问父类中的成员
2. instanceof  判断所属类型
3.
 
   class DuoTaiDemo
    {
            public static void main(String[] args)
            {
                Fu f = new Zi();
                f.method1();
                //f.method3();    
                /*
                    在多态中成员函数的特点:
                        在编译时期:参阅引用类型所属的类中是否有调用方法,
                                                如果有f.method1();编译通过,没有的话编译失败f.method3();
                        在运行时期:参阅对象所属的类型中是否有调用方法
                        简单总结:成员函数在多态调用时,编译看左边,运行看右边                        
                */
                
                Fu f = new Zi();
                System.out.println(f.num);//结果是fu类中的num :5
                /*
                    在多态中,成员变量的特点:
                    无论编译和运行,都参考左边(引用型变量所属的类)。
                    
                    在多态中,静态成员函数的特点:
                    无论编译和运行,都参考左边
                */
            }
    }
    
    class Fu
    {
        int num = 5;
        public void method1()
        {
            System.out.println("method_fu_1");    
        }
        
        public void method2()
        {
            System.out.println("method_fu_2");    
        }
    }
    
    class Zi extends Fu
    {
        int num = 8;
        public void method1()
        {
            System.out.println("method_zi_1");    
        }
        
            public void method3()
        {
            System.out.println("method_zi_3");    
        }
    }            


    4.

/*
        接口和多态实现了程序的扩展性
    */
    class DuoTaiDemo1
    {
        public static void main(String[] args)
        {
            MainBoarde mb = new MainBoarde();
            mb.run();
            mb.runPCI(new NetCard());
        }
    }
    
    interface PCI
    {
        public abstract void open();
        public abstract void close();
    }
    
    class MainBoarde
    {
        public void run()
        {
            System.out.println("mainboard run")    ;
        }    
        
        public void runPCI(PCI p)
        {
            if(p != null) {
                p.open();
                p.close();    
            }    
        }
    }
    
    class NetCard implements PCI
    {
            
        public  void open(){
            System.out.println("NetCard open");    
        }
        public  void close(){
                System.out.println("NetCard close");        
        }
    }        


5.

/*
        object 重写equals方法
    */
    class MyPerson
    {    
        private int num = 0;
        
        public void setNum(int num)
        {
            this.num = num;
        }
        
        public int getNum()
        {
            return this.num;    
        }
        //重写equals方法
        public boolean equals(Object obj)
        {
                //判断是否是MyPerson类型
                if(!(obj instanceof MyPerson))
                    return false;
                    //强制转为MyPerson类型
                    MyPerson p = (MyPerson)obj;
                this.num = p.num;
                return true;    
        }
    }

class ObjectTest
{
    public static void main(String[] args)
    {
        MyPerson p1 = new MyPerson();
        p1.setNum(2);
        MyPerson p2 = new MyPerson();
        p2.setNum(2);
        System.out.println(p1.equals(p2));
        System.out.println(p1 == p2);
    }    
}    


6.类不能被private修饰,内部类可以被private修饰
7.局部内部类中的成员函数不能被static修饰

8.

/*
        内部类定义在局部时
        1.不可以被成员修饰符修饰
        2.可以直接访问外部类中的成员,因为还持有外部类中的引用
            但是不可以访问它所在的局部中的变量,只能访问final修饰的局部变量
    */
    class Outer
    {
            int x = 1;
            void function(final int a)
            {
                final int y =5;
                class Inner //内部类
                {
                    void function()
                    {
                        System.out.println("innner:"+y);//只有将y定义成final类型才能访问
                        System.out.println("innner:"+a);//只有将a定义成final类型才能访问
                    }    
                }    
            }    
            
            public void method()
            {
                    Inner in = new Inner();
                    in.function();
            }
    }


9.匿名内部类:
    a.匿名内部类其实就是内部类的简写格式
    b.定义匿名内部类的前提:
            内部类必须是继承一个类或者实现接口
    c.匿名内部类的格式: new 父类或者接口(){定义子类的内容}        
    d.其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的对象。
    e.匿名内部类中定义的方法最好不要超过3个
    

10.

/*
        匿名类使用的一个示例
    */
        interface Inner
        {
            public abstract void method();    
        }
        
        class Test
        {
            public static Inner function()
            {
                Inner in = new Inner()
                {
                    public void method()
                    {
                        System.out.println("run method");
                    }
                };
                return in;
            }    
        }
        class InnerClassTest
        {
            public static void main(String[] args)
            {
                Test.function().method();    
            }
        }


11.异常:就是程序在运行时出现不正常情况
     异常由来:问题也是现实生活中的一个具体的事务,也可以通过java的类的形式进行描述。并封装成对象。
                         其实就是java对不正常情况进行描述后的对象体现。
     对问题的划分:一种是严重的问题;一种是非严重的问题
    
     对严重的问题:java通过error类进行描述
             对于Error一般不编写针对性的代码进行处理
     对于非严重的问题:java通过exception类进行描述
             对于Exception可以使用针对性的处理方式处理
     Throwable
                     ---Error
                     ---Exception
12.捕捉异常的一个例子
    class ExceptionDemo
    {
        public static void main(String[] args)
        {
            int a = 4,b = 0;
            
            try {
                int c = a/b;
            } catch (Exception e) {
                System.out.println("除数不能为0");
                System.out.println(e.getMessage());
                System.out.println(e);//异常名称:异常信息
                e.printStackTrace() ;//异常名称:异常信息:异常位置
                
            }
                System.out.println("over");
        }
    }     


13.    如何为自定义异常?
            因为父类已经把异常信息的操作都完成了
            那么就可以直接通过getMessage方法获取
        自定义异常:必须是自定义类继承Exception        
         
         继承Exception原因:
         异常体系有一个特点:异常类和异常对象都被抛出
         他们都具备可抛性,这个可抛性是Throwable这个体系中独有的特点
         
         只有这个体系中的类和对象才可以被throws和throw操作
         
    
    //自定义一个异常类
        class FuShuException extends Exception
        {
            private int value = 0;    
            FuShuException()
            {
                super();        
            }
        
            FuShuException(String message,int value)
            {
                //父类Exception中构造函数Exception(String message)
                super(message);
                this.value = value;        
            }
            
            public int getValue()
            {
                return value;    
            }
        }
        
        
        class Div
        {    
            public int div(int a,int b) throws FuShuException
            {
                if(b<0)
                    throw new FuShuException("除数不能为负数",b);    //抛出可能的异常
                return a/b;    
            }
        }
        
        class ExceptionDemo
        {
            public static void main(String[] args)
            {
                Div d = new Div();
                //捕获可能出现的异常
                try {
                    d.div(5,-1);
                } catch (FuShuException e) {
                    System.out.println(e.getMessage());
                    System.out.println("被除数是"+e.getValue());
                }
                    System.out.println("over");
            }


14.throws:使用在函数上。   后面跟异常类,可以跟多个,用逗号隔开      
     throw使用在函数内                后面跟的是异常对象
                
        }

15

/*
    内部类的访问规则:
    1.内部类可以直接访问外部类的成员,包括私有
        之所有可以直接访问外部类中的成员,是因为内部类中持有了外部类的引用,格式:外部类名.this
    2.外部类要访问内部类,必须建立内部类对象
    
    访问格式:
    1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类的对象。
    格式:外部类.内部类 变量名 = new 外部类.new 内部类
                Outer.Inner in = new Outer().new Inner();
    2.当内部类在成员位置上,就可以被成员修饰符所修饰
        比如:private 将内部类在外部类中进行封装
                    static 内部类具备static的特性
                    当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
                    
                    在外部其他类中,如何直接访问static内部类中的非静态成员呢?
                    new Outer.Inner().function();
                    
                    在外部其他类中,如何直接访问static内部类中的静态成员呢?
                    
                    Outer.Inner.function();
                    
            注意:当内部类中定义了static成员,内部类也必须定义成static
                        当外部类的static方法要访问内部类函数时,内部类也必须定义成static
                                
    */
    class Outer
    {
        int x = 1;
        class Inner //内部类
        {
            int x = 2;
            void function()
            {
                int x = 3;
                System.out.println("innner:"+x);//打印结果是3
                System.out.println("innner:"+this.x);//打印结果是2
                System.out.println("innner:"+Outer.this.x);//打印结果是1
            }    
        }    
            public void method()
        {
                Inner in = new Inner();
                in.function();
        }
    }
    
    class InnerClassDemo
    {
        public static void main(String[] args)
        {
            //直接访问内部类中的成员
            Outer.Inner in = new Outer().new Inner();
            in.function();
        }
    }


    
                
             
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值