黑马程序员_面向对象2

一、继承

1继承的涵义

在程序中,可以使用extends关键字可以让一个类继承另外一个类。

继承的类为子类(派生类),被继承的类为父类(超类基类)

2、什么时候使用继承

当我们需要定义一个能实现某项特殊功能的类时,就可以使用继承。

最终还是为了一个目的,实现代码的复用性

当我们定义一个类时,发现另一个类的功能这个类都需要,而这个类又要增加一些新功能时,就可以使用extends关键字继承那个类,这样那个被继承类的功能就都有了,不必重写编写代码。这时只要在新的类中编写新的功能即可,原有代码就被复用了。

3向上转型

把一个子类当做父类来用是可以的,因为父类有的子类都有

把一个父类当做子类来用就不可以了,因为子类有的父类不一定有

可以定义一个父类类型的变量来记住子类对象,这在程序中称之为向上转型

4、子父类中的成员

关于成员变量(案例一):

在子父类中,成员的特点体现。

成员变量;成员函数;构造函数。

1成员变量。

当本类的成员和局部变量同名用this区分。

当子父类中的成员变量同名用super区分父类。

this和super的用法很相似。

this:代表一个本类对象的引用。

super:代表一个父类空间。

如下代码所示:

class Fu

{

       private int num = 4;

       public int getNum()

       {

             return num;

       }

}

class Zi extends Fu

{

       private int num = 5;

       void show()

       {

             System.out.println(this.num+"....."+super.getNum());

       }

}

class ExtendsDemo2 

{

       public static void main(String[] args) 

       {

               Zi z = new Zi();

               z.show();

       }

}

(2)成员函数。

当子父类中出现成员函数一模一样的情况,会运行子类的函数。

这种现象,称为覆盖操作。这时函数在子父类中的特性。

函数两个特性:

1,重载。同一个类中。overload

2,覆盖。子类中。覆盖也称为重写,覆写。Override

覆盖注意事项:

1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。

2,静态只能覆盖静态,或被静态覆盖。

class Fu

{

       public static void show()

       {

               System.out.println("fu show run");

       }

}

class Zi extends Fu

{

       public static void show()

       {

               System.out.println("Zi show run");

       }

}

class Extends Demo3 

{

       public static void main(String[] args) 

       {

               //Zi z = new Zi();

               //z.show();

               NewPhone p = new NewPhone();

               p.show();

               p.call();

       }

}

什么时候使用覆盖操作?

当对一个类进行子类的扩展时,子类需要保留父类的功能声明,

但是要定义子类中该功能的特有内容时,就使用覆盖操作完成.

如下代码体现:

Class  phone

{

       Void call()

       {

       }

       Void show()

       {

            System.out.println("number");

       }

}

Class NewPhone extends Phone

{

       Void show()

       {

            System.out.println("name");

            System.out.println("pic");

            super.show();

       }

}

7、单例设计模式

设计模式:对问题行之有效的解决方式,其实它是一种思想

解决的问题:可以保证一个类在内存中的对象的唯一性。

必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

必须对于多个程序使用同一个配置信息对象是,就需要保证对象的唯一性。

如何保证对象的唯一性?

(1)不允许其他程序用new创建该类对象。

(2)在该类创建一个本类实例。

(3)对外提供一个方法让其他程序可以获取该对象。

步骤:

(1)私有化该类构造函数。

(2)通过new在本类中创建一个本类对象。

(3)定义一个公有的方法,将创建的对象返回

//饿汉式

Class single

{

        Private static single s=new single();

        Private single(){}

        Public static single getInstance()

        {

                  Retrun s;

        }

}

//懒汉式

Class single2

{

          Private static single s=null;

          Private single2(){}

          Public static single2 getInstance()

          {

                    If(s==null)

                       S=new single2();

                          Return s;

           }

}

Class singledemo

{

           Public static void main(String[] args)

           {

                      Single s1=single.getInstance();

                      Single s2=single.getInstance();

                      System.out.println(s1==s2);

                     //single ss=single.s;

                     

                     //test t1=new test();

                     //test t2=new test();

                      Test t1=test.getInstance();

                      Test t2=test.getInstance();

                       

                      T1.setNum(10);

                      T2.setNum(20);

                      System.out.println(t1.getNum());

                      System.out.println(t2.getNum());

               }

}

Class test

{

          Private int num;

          Private static test t=new test();

          Private test(){}

          Public static test getInstance()

          {

                        Return t;

          }

           Public void setNum(int num)

          {

                        This.num=num;

           }

            Public int getNum()

            {

                           Return num;

            }

}

面向对象总结:

1、面向对象和面向过程思想。

   面向对象强调的是对象实例

   面向过程强调的是动作。

   对象将动作进行封装。

   在问题领域中,我们先去找的都是涉及的对象,然后分析对象的属性和行为

2、面向对象的特点。

1)是一种常见思想;(2)复杂变简单 ; (3)执行者变指挥者

举例:面试的例子

3、类与对象的关系

   类:就是对事物的描述,其实类就是将对象共性的内容进行抽取。

   对象:就是该类事物实实在在存在的个体,在java中通过new来完成创建的。

   堆内存的对象主要用于封装对象中的特有数据。

4、类中的成员:

   成员变量:事物的属性;      成员函数:事物的行为。

 

成员变量和局部变量的区别:

   如何使用成员,只要建立该类对象,并通过“对象.对象成员”就可以完成调用

5、封装。

   隐藏实现细节,并对外提供公共的访问方式。

   函数或者类都是一个封装体。

   特点:

   (1)隔离的变化    (2)便于使用   (3)提高复用性    (3)提高安全性。

  

 6,构造函数。

写法特点:

(1)函数名和类名相同。

(2)不需要定义返回值类型

(3)没有具体的返回值。但是又return语句,用于结束构造函数。

     使用特点:

     (1)定义类中,有默认的空参数的构造函数。如果已经自定义好,那么默认就没有了。

     (2)构造函数在类中有多个,是重载形式体现出来的。

     构造函数的作用:

     用于给对象进行针对性的初始化。

       什么时候使用构造函数呢

       当对象创建时就需要一些内容(数据和行为),那么这些内容都定义在构造函数中。

7.this关键字

  This:代表的是对象。哪个对象调用了this所在的函数,this就代表哪个对象。

  用法体现

  (1)当成员变量和局部变量同名时,可以用this区别。

  (2)当构造函数调用本类其他构造函数时,可以用this完成。This(实际参数);

   这种调用必须定义在构造函数的第一行,初始化动作先完成。

 

   应用:只要在定义功能时,用到了本类对象,那么就是用this来表示。

8.static关键字:

   特点:

  (1)修饰成员。

  (2)随着类加载,随着类消失。

  (3)优先于对象。

  (4)用类名直接访问

   使用注意事项:

  (1)静态方法只能访问静态,静态有访问局限。

  (2)静态方法中不能有this  super关键字

  (3)主函数是静态的。

   什么时候使用静态?

  (1)当成员变量的数据各个对象都相同时,可以用static修饰,让多个对象共享。

  (2)函数如果访问了特有数据(非静态成员变量),该函数时非静态的。

       函数如果没有访问特有数据,那么该类创建对象是么有意义的,所以构造函数需要私有化。

9.代码块。

   (1)局部代码块:对局部变量的生命周期进行控制。

   (2)构造代码块:对所有对象进行初始化。

   (3)静态代码块:对类进行初始化。

10.单例设计模式:

   (1)解决的问题:保证类在内存的对象唯一性。

   (2)两种方式:饿汉式和懒汉式(延迟加载方式)。

8抽象类: 

抽象:笼统,模糊,看不懂!不具体。 

特点: 

(1)

方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。 

抽象方法必须定义在抽象类中。该类必须也被abstract修饰。 

(2)

抽象类不可以被实例化。为什么?因为调用抽象方法没意义。 

(3)

抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。 否则,这个子类还是抽象类。 

(4)、抽象类中有构造函数吗?  

有,用于给子类对象进行初始化。 

(5)

,抽象类可以不定义抽象方法吗? 

可以的。 但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。  通常这个类中的方法有方法体,但是却没有内容。 

abstract class Demo  

       void show1() {} 

       void show2() {}  

(6)抽象关键字不可以和那些关键字共存

private不行 ;static不行; final不行 

(7)抽象类和一般类的异同点。 

 相同点:  

 抽象类和一般类都是用来描述事物的,都在内部定了成员。 

 不同: 

一般类有足够的信息描述事物。 抽象类描述事物的信息有可能不足。 

一般类中不能定义抽象方法,只能定非抽象方法。 抽象类中可定义抽象方法,同时也可以定义非抽象方法。 

一般类可以被实例化。 抽象类不可以被实例化。 

(8)抽象类一定是个父类吗? 

是的。因为需要子类覆盖其方法后才可以对子类实例化。 

abstract  class  Demo 

        abstract  void  show(); 

class DemoA extends Demo 

{  

        void show() 

        { 

                System.out.println("demoa show");  

        } 

class DemoB extends Demo 

{  

        void show() 

        { 

                System.out.println("demob show"); 

        }

abstract  class 犬科 

        abstract  void 吼叫 (); 

class 狗 extends 犬科 

{  

        void 吼叫 ()  

        { 

                System.out.println("汪汪");  

        } 

class 狼 extends 犬科 

        Void 吼叫 ()  

        { 

                System.out.println("嗷嗷");  

        } 

class  Abstract  Demo 

        public static void main(String[] args) 

        { 

               System.out.println("Hello World!");  

        } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值