static
Java中的static关键字主要用于内存管理。我们可以应用static关键字在变量、方法、块和嵌套类中。 static关键字属于类,而不是类的实例。
被static修饰的数据在内存中只会存在一份数据。所以这个数据适合用来共享数据。
什么意思呢?
共享数据是因为static修饰的变量在赋值后这个变量将会一直是你所赋的值,当你在需要创建多的对象的时候但又需要给属性赋一样的值,就需要用到static修饰变量
例如:
public class Test8 {
public static void main(String[] args) {
A a = new A();
a.name="小黑";
a.age=18;
a.sex="男";
a.show();
A a1 = new A();
a1.name="小白";
a1.age=15;
a.age=18;
a1.show();
}
}
class A{
String name;
int age;
static String sex;
public void show(){
System.out.println(name+age+sex);
}
}
![](https://img-blog.csdnimg.cn/71a3350950854a98896b0818f5b71368.png)
在这段代码里,因为两个学生都是男性,所有属性值赋值是一样的,就不用重复赋值,给sex属性用static修饰,让它为静态变量。
static修饰变量
被static修饰的变量称作静态变量或类变量;没有被static修饰的变量,称为实例变量。静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配(存储在“方法区”),可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,每创建一个类的实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
静态变量并不是所在类的某个具体对象所有,而是该类的所有对象所共有的,静态变量既能被对象调用,也能直接拿类来调用。所以一般在需要实现以下两个功能时使用静态变量:在多个对象之间共享时、方便访问变量时。
static修饰方法
被static修饰的方法称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。静态方法一般用于工具类中,可以直接拿类名调用工具方法进行使用。
例如:
public class Test8 {
public static void main(String[] args) {
A.show();
}
}
class A{
static String name;
static int age;
static String sex;
public static void show(){
name="小黑";
age=18;
sex="男";
System.out.println(name+age+sex);
}
}
![](https://img-blog.csdnimg.cn/c5014f078b7c4d1b9fb8ad993f5da62d.png)
注意:
- 它们仅能调用其他的static 方法。
- 它们只能访问static数据。
- 它们不能以任何方式引用this或super。
多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态存在的三个条件:
- 继承:必须有子类继承父类
- 重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
举个例子:
public class Test {
public static void main(String[] args) {
Teacher j1 = new JavaTeacher();
j1.giveLesson();
j1.introduction();
Teacher n1 = new NETTeacher();
n1.giveLesson();
n1.introduction();
}
}
class Teacher {//教师类
String name;//教员
String area;//中心属性
public void giveLesson(){
}
public void introduction(){
}
}
class NETTeacher extends Teacher{
public void giveLesson(){
System.out.println("授课的步骤依次是:打开Visual Studio 2005、实施理论课授课");
}
public void introduction(){
name="小白";
area="武汉";
System.out.println("姓名:"+name+"中心:"+area+"我是一名java讲师!");
}
}
class JavaTeacher extends Teacher {
public void giveLesson(){
System.out.println("授课的步骤依次是:打开Eclipse、实施理论课授课");
}
public void introduction(){
name="小黑";
area="长沙";
System.out.println("姓名:"+name+"中心:"+area+"我是一名.net讲师!");
}
}
他们的引用变量不同,所调用的方法不同,输出结果不同,这就是多态。
那么多态有什么优点呢?
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性