黑马程序员技术交流社区

标题: java自学笔记08 [打印本页]

作者: 阿秋    时间: 2015-8-16 10:08
标题: java自学笔记08
/*多态的体现*/
//多态的体现形式:父类的引用指向了子类对象
一个对象对应多种形态造成了:
Animal c=new Cat();
//多态提高了代码的扩展性:
public static void function(Animal a)
{
        a.eat();
}
/*多态的前提*/
1.必须是类与类之间有关系,要么是继承要么是实现。
2.必须存在覆盖,即父类特有的抽象方法,子类特有的特性不能代表父类
/*多态的好处*/
多态的出现大大提高了程序的扩展性
/*多态的弊端*/
只能使用父类的引用访问父类中的成员.
Animal c=new Cat()

/*多态的转型*/
//向上转型
Animal c=new Cat();                                        //将猫向上转型成动物
但有一个问题,当我需要用到子类当中特有的方法时,Animal类中的c显然做不到,
怎么办呢?  利用向下转型实现
Cat a=(Cat)c;                                                        //这样的c和a仍然是同一个对象
/*多态出现的特点*/
class Fu
{
        void method1()
        {
                System.out.println("Fu method-1");
        }
        void method2()
        {
                System.out.println("Fu method-2");
        }
}
class Zi extends Fu
{
        void method1()
        {
                System.out.println("Zi method-1");
        }
        void method3()
        {
                System.out.println("Zi method-3");
        }
}
class Q1
{
        public static void main(String[] args)
        {
                Zi z=new Zi();
                z.method1();
                z.method2();
                z.method3();                                //打印结果为:Zi 1,Fu 2,Zi 3
                Fu f=new Zi();
                f.method1();
                f.method2();
                //f.method3();                                //编译失败
        }
}
//注:为什么会失败,在Fu f=new Zi()中,javac(编译时期)中的对象还不存在
//单看Fu f中并没有method3()这个方法,所以编译失败
//运行过程,看new Zi()的方法内容。
/*非静态成员函数,成员变量,静态成员函数在多态调用时的特点*/
1.非静态成员函数:Fu f=new Zi(),编译看左边运行看右边;
2.成员变量:(注:成员变量不存在覆盖重写),f.num和z.num的均看左边;
3.静态成员函数:(用static修饰),f.method和z.method均看左边,原理是:对于static来说是随着类的加载而加载与对象无关,
所以只看左边。
class Animal
{
        public void eat()
        {
                System.out.println("吃饭");
        }
        public void sleep()
        {
                System.out.println("睡觉");               
        }
}
class Dog extends Animal
{
                public void eat()
                {
                        System.out.println("吃骨头");
                }
                public void sleep()
                {
                        System.out.println("站着睡觉");               
                }
}
class AnimalTool
{
        public static void function(Animal a)
        {
                a.eat();
                a.sleep();
        }
}
class Q1
{
        public static void main(String[] args)
        {
                Dog d=new Dog();                                                        //不需要非要用Animal d=new Dog()形式来建立对象,直接本类建立对象即可,
                AnimalTool.function(d);                                                //因为有继承关系,并且子类调用的为父类引用
        }
}
/*接口多态事例*/
interface PCI                                                                                //通过接口PCI制定规则,在规则允许的情况下向外扩展
{
        public void open();                                                                //"扩展"或"制定规则"相当于"使用多态"
        public void close();                                                        //"扩展"的方法是制定一个接口,这样在新的工具产生时就不用改动旧代码,使新工具直接实现接口即可。
}
class MainBoard
{
        public void run()
        {
                System.out.println("MainBoard run");       
        }
        public void usePCI(PCI p)                                               
        {
                if(p!=null)
                {
                  p.open();
                  p.close();
                }
        }
}
class Q1
{
        public static void main(String[] args)
        {
                MainBoard mb=new MainBoard();
                mb.run();
                mb.usePCI(new NetCard());
        }
}
class NetCard implements PCI                                                //在规则的制定下,拥有很强的扩展性
{
        public void open()
        {
                System.out.println("NetCard open");       
        }
        public void close()
        {
                System.out.println("NetCard close");       
        }
}
class SoundCard implements PCI
{
        public void open()
        {
                System.out.println("SoundCard open");       
        }
        public void close()
        {
                System.out.println("SoundCard close");       
        }
}
/*object类*/
object类:object类是所有类直接或间接的父类

/*Object类中的方法 equals */
/*equals*/
class Demo //extends Object                                                                                //并不需要写出 extends Object,因为所有的类都是Object类的子类或间接子类
{
        //super();
}
class Q1
{
        public static void main(String[] ags)
        {
                Object d1=new Demo();
                Object d2=new Demo();
                boolean a=d1.equals(d2);
                System.out.println(a);
                System.out.println(d1.equals(d2));                                                //两者直接进行比较
                int x=3;
                System.out.println(d1.equals(x));                                                //结果是false 可见不同类也是可以相互比较的
        }
}
/*equals与==的区别*/
System.out.println(d1.equals(x));                                                                //equals可以进行不同类别的比较
System.out.println(d1==x);                                                                                //==只能进行同类的比较
/*instanceof*/
//instanceof用于判断前者个体是否属于后者类
class Demo
{
}
class Q1
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                boolean b=d instanceof Demo;                                                         //结果为boolean类型,格式:单位 instanceof 类别
                System.out.println(b);
                System.out.println(d instanceof Demo);
        }
}
/*Object类中的toString()方法*/
class Demo
{
}
class Q1
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                String x="我是阿秋";
                System.out.println(x.toString());                        //本类打印只能是String类型
                System.out.println(d.toString());                        //将类中对象打印就是  类名@哈希值
                System.out.println(d.hashCode());
        }
}
/*java中API的显示构造*/
public String toString()                                                                                  //public表示该方法可以直接调用,该方法的返回值是String类型
public int hashCode()                                                                                          //直接调用,返回值是int类型
/*一般要使用toString显示其他格式时,需要用到覆盖操作*/
public String toString()
{
        return "Demo"+num;
}



作者: JXHIUUI    时间: 2015-8-16 10:22
发自学笔记是不是不算是灌水吧?好象还可以得黑马币




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2