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()一样,必须写在第一行。一般来说,当我们要给一些变量默认值时就会这样。