若类的方法前加了static关键字,则该方法称为静态方法,反之为非静态方法。
为什么使用静态方法
静态方法的好处就是不用生成类的实例就可以直接调用。
static方法修饰的成员不再属于某个对象,而是属于它所在的类。只需要通过其类名就可以访问,不需要再消耗资源反复创建对象。
在类第一次加载的时候,static就已经在内存中了,直到程序结束后,该内存才会释放。
静态方法中this指向:this指向类而不是类的实例
class Foo {
static ba() {
this.num();
}
static num () {
console.log(‘hello‘);
}
num() {
console.log(‘world‘);
}
}
Foo.ba() // hello
继承相关:静态方法可以被子类继承, 构造方法不能被继承。
1.调用父类的成员方法
父类
package expression;
public class Computer {
String SayHellow(){
return "welcome";
}
子类
package expression;
public class Pad extends Computer{
String SayHellow(){
return "welcome"+"你好呀";
}
如果我要让欢迎语“welcome”换为“萨瓦迪卡”,父类和子类都要修改,这时可以用super继承关键字
package expression;
public class Pad extends Computer{
String SayHellow(){
return super.SayHellow()+"你好呀";
}
2.调用父类的构造方法
package expression;
public class Pad extends Computer{
public Pad(){
//初始化
super();//调用父类的构造方法
}
String SayHellow(){
//调用父类的成员方法
return super.SayHellow()+"你好呀";
}
3.调用父类的属性
package expression;
public class Pad extends Computer{
public Pad(){
//调用父类的属性
this.screen = super.screen;//this 和super 是一样的,只不过this是本类,super是父类
}
String SayHellow(){
//调用父类的成员方法
return super.SayHellow()+"你好呀";
}
}
难点二:静态属性的理解,以及和实列属性的区别
理解了静态的本质就知道静态属性是class类自身的属性
相对的实例属性是指类的实例的属性,调用时使用 new Foo().‘属性名‘
语法
class 类名{
方法名(){
//方法体
}
}
var 变量名 = new 类名()
定义实例属性的方法
// 声明一个类
class Stuen{
read(){
console.log(‘stuen read()...‘)
}
}
// 实例化一个对象
var s1 = new Stuen()
s1.read()
// 构造方法
class Student{
constructor(name,age,sex){
console.log(‘构造方法‘)
// 实例属性
this.name = name;
this.age = age;
this.sex = sex;
}
// 实列方法
read(){
console.log(‘student read()....‘+this.name);
}
}
// 实列化对象
var s1 = new Student(‘tom‘,20,‘男‘)
s1.read();
console.log(s1.name)
console.log(s1.age)
console.log(s1.sex)
总结:优势与弊端
在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能
为了方便,不用实例化,但这样程序编译运行时就占用了系统资源
静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放。还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的。