三、java面向对象基础二

1.         继承?

Ø  为什么引入继承?可以提高代码的利用率

Ø  通过那个关键字实现继承?extends关键字

Ø  Java支持单继承,如果想实现多继承?

第一种方式:间接继承

第二种方式:代码进一步进行抽象,放到接口(后面会详细讲解)中。

Ø  子类可以继承父类的属性或者方法?

有限制:

        父类私有的属性和方法不能继承。是用private修饰符来修饰的

         Public protected可以继承

         Default在同一个包可以继承。

Ø  存在继承的话,在创建子类对象时(通过调用构造方法进行创建):

先调用父类的构造方法,然后调用子类的构造方法。

为什么子类创建对象时,需要创建父类?

 

2.         static

Ø  static来修饰成员变量:该成员变量隶属于类,在类加载时,会为该成员变量分配内存空间。

 如何访问:规范的话,类名.静态成员变量名

而普通的成员变量是属于对象的。对象.成员变量名

 

案例:

publicclass StaticDemo01 {

    //static来修饰成员变量

    privatestatic String staticArr="static成员变量";

    //成员变量

    private String arr="普通的成员变量";

 

    /**

     *@paramargs

     */

    publicstaticvoid main(String[] args) {

       StaticDemo01 s1=new StaticDemo01();

       s1.arr="s1对象的成员变量值";

       StaticDemo01 s2=new StaticDemo01();

       s2.arr="s2对象的成员变量值";//14行和第16行操作的是同一个arr吗?

       System.out.println(s1.arr);

      

       s1.staticArr="s1对象的成员变量值";

       s2.staticArr="s2对象的成员变量值";//19行和20行操作的是同一个内存区域

       System.out.println(s1.staticArr);

 

    }

 

}

Ø  static修饰成员方法:该方法隶属于类。

如何访问静态方法呢?类名.方法名();

Ø  Static来修饰静态代码块

publicclass StaticDemo02 {

    privatestaticintstaticA;

   

    static{

       //该代码块就是一个静态的代码块

       //静态代码块的作用是什么?一般用静态代码块对静态的成员变量进行初始化。

       staticA = 8;

       //静态代码块什么时候执行?在jvm加载类的时候执行。而且仅执行一次

      

       System.out.print("静态代码库执行...");

    }

   

    public StaticDemo02(){

       System.out.println("构造方法执行.....");

    }

 

    /**

     *@paramargs

     *@throwsClassNotFoundException

     */

    publicstaticvoid main(String[] args) throws ClassNotFoundException {

       //加载类,会执行静态代码块里面的内容。

       //Class.forName("com.inspur.javach6.StaticDemo02");

      

       StaticDemo02 s1 = new StaticDemo02();

      

       StaticDemo02 s2 = new StaticDemo02();

    }

 

}

3.         Final(最终)

Ø  修饰类:

如果修饰类,说明该类是最终类,所谓的最终类是指,不能被其他的类所继承。比如说String类。

Ø  修饰变量:(常量)

Final关键字是唯一可以修饰局部变量的关键字。

如果修饰变量,该变量不能改变?不能改变,是指的不能改变什么东西?不能改变的是地址。

publicclass FinalDemo01 {

   

    privatefinal String str1="hello";

    privatefinalint[] intArray={1,2,3};

 

    /**

     *@paramargs

     */

    publicstaticvoid main(String[] args) {

       FinalDemo01 f=new FinalDemo01();

       f.str1 = "world";//改变的地址,所以不能改变

      

       f.intArray[0]=3;//改变的内容,可以改变。

       f.intArray = newint[3];//改变的地址,所以不能改变

 

    }

 

}

Ø  修饰方法:

如果修饰方法,指该方法是最终的方法,不能被子类重写(覆盖)

 

4.         this

每一个对象,都有一个引用,指向自己,这个引用就是this:

this关键字的作用:

  1:调用被隐藏的成员变量。

publicclass Demo05 {

    private String name="Rose";

    public static void main(String[] args) {

        Demo05 d = newDemo05();

        d.print();

    }

    Public void print(){

        //因为重名,所以局部变量就隐藏了成员变量

        String name="Jack";

        System.err.println("name is:"+name);//按最近访问的原则=Jack

        //如果需要访问成员变量,必须要添加this,即这个类的的..

        System.err.println("this.name:"+this.name);

    }

}

publicclass Demo05 {

    private String name="Rose";

    public Demo05(String name){//接收一个参数的构造

        //必须要使用this

        this.name=name;

    }

    publicstaticvoid main(String[] args) {

        Demo05 d = new Demo05("Mike");//传递参数调用构造-给成员变量设置值

        d.print();

    }

    publicvoidprint(){

        //因为重名,所以局部变量就隐藏了成员变量

        String name="Jack";

        System.err.println("name is:"+name);//按最近访问的原则=Jack

        //如果需要访问成员变量,必须要添加this,即这个类的的..

        System.err.println("this.name:"+this.name);

    }

}

在一个方法中,所有的实例的成员或是实例的方法,前面没有this.默认也是有this:

 

 

  2:返回自己的引用。(略)

  3:调用另一个构造方法。

                   必须要在构造方法中。

                   必须要在在第一句。

publicclass Demo06 {

    private String name;

    public Demo06() {

        //在构造的第一句,必须要是第一句,通过this调用另一个构造方法

        this("unnamed");[H1] 

        System.err.println("已经调用完成了");

    }

    public Demo06(String name){

        this.name=name;

    }

    publicstaticvoid main(String[] args) {

        //要求,如果用户没有调用有参数的构造,

        //则默认的名称为 unnamed,如果调用了有参数的构造,就是用户传递的名称

        Demo06 d = newDemo06();

        System.err.println(d.name);//Jack

    }

}

 

5.         super:指向父对象。

作用:

     1:调用父类被隐藏的变量或是方法。

Class BlackDog extends Dog{

    public String name="Jerry";

    @Override

    publicvoid run() {

        String name="Jack";

        //可以通过 super关键字,指定访问的是父类的变量

        System.err.println("this.name:"+this.name+","+super.name);

    }

}

         2:在子类的构造方法中调用父类的构造。

      Super关键字调用父类构造方法必须放在构造方法第一行?

      在构造方法中thissuper可以同时出现吗?不能

class Animal {

    public Animal(String name) {

   

    }

    publicvoid run(){

        System.err.println("4:Animal is Running..");

    }

}

//此时,子类的默认构造,会去调用父类的默认构造,但父类没有默认构造

class Dog extends Animal{

    //可以在子类中,通过super关键字,显式的去调用父类的某人构造

    public Dog() {

        super("Jack");

    }

    //如果父类没有默认构造,子中所有的构造方法必须要可以调用父类的构造

    public Dog(inta){

        this();//此处可以是super("Rose")也可可以是this().

    }

}

classBlackDogextends Dog{

}

 

 

 


 [H1]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值