Java-面向对象进阶1-static和继承

static:

static表示静态,是java里的一个修饰符,可以修饰成员方法,成员变量

静态变量

被static修饰的成员变量,叫做静态变量

如果是在类的成员变量前面在限定符后面,那么表示这个类的所有对象都共享同一个该成员变量。

并且,一旦用static去修饰之后,这个变量还多了一个调用方式,那就是用类名去调用。

特点:

1.被该类所有对象共享。

2.静态变量是优先于对象存在的。

调用方式:

1.类名调用(推荐)

2.对象名调用

静态方法:

静态方法就是被static修饰的成员方法

特点:

1.多用在测试类和工具类中

2.Javabean类中很少会用

调用方式:

1.类名调用(推荐)

2.对象名调用

类的分类:

类大致分为三种:Javabean类、测试类、工具类

Javabean类:

用来描述一些事物的,比如:Student,Teacher,Dog,Cat等

测试类:

用来检查其他的类是否书写正确,带有main方法的类,是程序的入口

工具类:

帮我们做一些事情,但是不描述任何事物的类

书写工具类有一些注意事项:

1.类名见名知意

2.私有化构造方法,因为构造方法一旦私有了,在外界就不能创建这个类的对象了,不让外界创建这个类的对象是因为这个类不描述任何事物,创造它的对象没有任何意义。

3.方法都定义为静态的,方便调用

注意事项:

1.静态方法只能访问静态变量和静态方法。

2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法

3.静态方法中没有this关键字

继承

面向对象的三大特征:封装、继承、多态

封装:

对象代表什么,就得封装对应的数据,并提供数据对应的行为

继承:

其实就是类与类之间的一个父子关系

java中提供一个extend关键字,用这个关键字,我们可以让一个类和另一个类建立起继承关系

public class Student extends Person{}

Student类称为子类(派生类),Person称为父类(基类或者超类)。

使用继承的好处:

1.可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性。

2.子类可以在父类的基础上,增加其他的功能,使子类更强大。

继承需要学习的点:

自己设计,用别人的。

什么时候需要用到继承:

当类与类之间存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑继承来优化代码。

继承的格式:

public class 子类 extends 父类{}

继承后子类的特点:

1.子类可以得到父类的属性和行为,子类可以直接去使用

2.子类可以在父类的基础上,再去新增其他的功能,子类更强大。

继承的特点:

java当中只支持单继承,不支持多继承,但支持多层继承。

单继承:

一个子类只能继承一个父类

不支持多继承:

子类不能同时继承多个父类(C++中是允许多继承的)。

多层继承:

子类A继承父类B,父类B可以继承父类C。

C则是A的间接父类,B是A的直接父类。

那这种关系有尽头吗?答案是有的,java当中有个最大的类,叫Object类,每个类都直接或者间接的继承于它。也就是即使某个类没有写extends于哪个类,它也是默认地继承于Object类的,这个是虚拟机自动地帮我们写的。

子类只能访问父类中非私有的成员

子类继承父类的内容

误区:

1.父类私有的东西,子类就无法继承

2.父类中非私有的成员,就被子类继承下来了

一.构造方法

不管私有还是非私有,都不能被子类继承

首先,如果可以被继承,那么就违背了构造方法名与类名相同的原则。

二.成员变量

非私有能被子类继承,私有也能被子类继承。这个地方与调用不同,私有的不能被调用。只不过私有的子类不能直接使用,如果一定要使用,只能用相应的get和set方法才使用。也就是说,私有的在子类里不能直接使用。

三.成员方法

非私有的能被子类继承,私有的不能被子类继承

某个类调用某个方法时,不是从下往上一层一层往父类寻找的,而是从*的父类开始,每个类给出一个常用方法表,也就是虚方法表,它里面包括非私有的,非静态的,非final的方法以及它的父类的虚方法。也就是说,我们调用的那个类的虚方法表里就有我们所需的方法,前提条件是方法必须是虚方法。只有父类中的虚方法才能被子类继承,如果我们要 找的方法不是虚方法,就还是需要一层层地调用,如果发现是自己父类的私有,就调不了,那如果是静态或者final的能调用吗?答案是可以调用,不过不能通过子类直接调用,不过可以通过父类的类名进行调用。

继承中成员变量和成员方法的访问

继承中:成员变量的访问特点:

满足就近原则:谁离我近我就用谁。

public class Fu{
    String name="Fu";
}
public class Zi extends Fu{
    String name="Zi";
    public void ziShow(){
        String name ="ziShow';
        Systemout.println(name);
    }
}

这里会打印什么呢?

局部变量name离它更近,所以会输出ziShow,那如果说没有写这个局部变量呢?

它会打印zi,如果本类的成员位置也没有,那会输出Fu.像这种出现了重名的情况,我们也可以用关键字去区分。

本来的成员变量用this关键字去调用,而它的父类用super关键字去调用。

this.name;
super.name;

那如果说想要调用其间接父类呢?

不能这样调用,子类中最多调用父类的成员变量。

那如果所有地方一个名字只出现在一个类中呢?比如只出现在父类当中呢?

那无论怎么调用都能够打印出来:

name;
this.name;
super.name;

原因也是就近原则。

继承中:成员方法的访问特点:

直接调用就满足就近原则,也可以用super调用,直接访问父类,用this去调用也是满足就近原则,谁离我近就调用谁,即使该类中没有调用的那个成员变量,只要父类中有,就可以调用。

class Fu{
    String str="111";
    void f1(){

        System.out.println(this.str);
    }
}
class Zi extends Fu{
    void f2(){
        this.f1();
        super.f1();
    }

}
方法的重写:

当父类的方法不能满足子类现在的需求时,需要进行方法的重写。

书写格式:

在继承体系中。当子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

重写的注解:

在重写的方法上面,我们要加一个@Override,检验子类重写时语法是否正确。如果重写的方法语法有错误,它会在注解哪里加上红色的波浪线,表示语法错误。

重写的本质:

其实就是从父类中继承虚方法表,然后把本类中作出改变的犯法覆盖掉。

方法重写的注意事项和要求:

1.重写方法的名称、形参列表必须于父类中的一致。

2.子类在重写父类方法时,访问权限必须大于等于父类(空着不写<protected<punlic).

3.子类重写父类方法时,返回值类型子类必须小于父类,因为子类能表示的范围更小。

4.建议:重写方法尽量和父类保持一致

5.只有被添加到虚方法表中的方法才能被重写。

继承中:构造方法的特点:

1.父类当中的构造方法是不会被子类继承的

2.子类中,所有的构造方法都会默认先访问父类中的无参构造。原因是子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类中的数据。

怎么调用父类构造方法?

子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行。

如果想要调用父类的有参构造,必须手动写super(参数列表)进行调用。

this和super关键字:

this:

可以理解为一个变量,表示当前方法调用者的地址值。

那为什么使用‘.’来访问的呢?

super:

代表父类存储空间。

关键字 访问成员变量 访问成员方法 访问构造方法
this

this.成员变量

访问本类成员变量

this.成员方法(....)

访问本类成员方法

this(...)

访问本类其他构造方法

super

super.成员变量

访问父类成员变量

super.成员方法(....)

访问父类成员方法

super(...)

访问父类构造方法

访问其他构造方法的意思是,比如我在调用一个空参构造方法,而这个方法里有一个this(参数列表即其赋值)(有点类似C++里的初始化列表或者缺省参数),那么,其相当于调用的是其他构造函数。

this(name="yyy",sex=1);

这样则虚拟机就不会添加调用super()了,而且这里的this()与super()一样,必须写在第一行。一般来说,当我们要给一些变量默认值时就会这样。

上一篇:Newstar_week1_week2_wp-week2 wp


下一篇:5G物联网主机引领企业数字化转型