当前位置: 首页 > 后端技术 > Java

【Java基础08】静态关键字static与继承(this、super、extends)

时间:2023-04-02 00:38:14 Java

1.关键字staticstatic是Java关键字,可以修饰成员变量和成员方法。1.1成员变量的修改1.1.1特点带关键字static的成员变量->静态变量:静态成员变量属于类属性,不带关键字static的成员变量在内存中只加载一次->实例变量:实例成员变量属于实例属性,变量每次创建新实例时初始化1.1.2访问格式静态成员变量:class.variablename(推荐)instance.variablename实例成员变量:instance.variablename1.1.3定义场景静态成员变量:attribute属于类,并且需要实例共享或者常量等。(例:pi3.14)实例成员变量:属性属于所有实例,但每个实例属性值不同1.1.4示例publicclassStaticTest1{//定义静态成员变量公共静态双PI=3.14;//定义实例成员变量publicdoubleresult;publicstaticvoidmain(String[]args){//计算圆的周长StaticTest1staticTest1=newStaticTest1();//圆的半径为2staticTest1.结果=2*2*StaticTest1.PI;System.out.println(staticTest1.result);}}PI是静态成员变量,需要共享。所有与圆相关的计算都需要它,所以它是静态共享的。内存简单说明:类加载完成后,在堆内存中创建PI变量,在方法区加载main方法,然后开始运行。将main方法加载到栈内存中,初始化StaticTest1类,在堆内存中创建实例,返回实例地址给staticTest1实例变量名,此时实例staticTest1中的静态变量指向静态变量PI由类加载创建,执行计算并赋值给staticTest1的实例成员变量,输出结果方法:静态成员方法属于类,在内存中只加载一次。所有对象共享函数,不加关键字staticmembermethods->Instancemembermethods:实例成员方法属于instance-specificmethods1.2.2访问格式静态方法:class.staticMethodInstance.Staticmethod(不推荐)成员方法:instance.成员方法1.2.3定义场景静态方法代表类的公共功能,不属于具体的对象方法。例如,计算加法就是两个数相加。这是一个特定的函数,每个实例的计算过程都是一样的。为方便起见,在程序中单独访问。成员方法表示特定于实例的方法。比如学生,每个人说话的声音不同,这是一个独特的功能,某个人说的话在一定程度上是可以识别的。程序中需要访问成员变量。1.2.4示例publicclassStudent{//定义一个静态方法publicstaticvoidtask(){System.out.println("所有学生的任务是学习");}//定义一个实例方法publicvoidsleep(){System.out.println("每个学生的睡姿都有其独特性");}publicstaticvoidmain(String[]args){//直接调用静态方法Student.task();//调用实例方法Studentstudent=newStudent();学生睡眠();您可能会认为任务方法也是学生独有的,这很好。就看你抽象出来的方法是不是所有对象共享的。例如,sleep方法也可以是静态方法。毕竟所有的学生都需要休息,但是每个学生的具体休息情况就变得独一无二了。1.3代码块代码块是一个类的五大部分(代码块、构造方法、成员变量、方法、内部类)之一,java中用{}括起来的是代码块1.3.1格式和示例静态代码block:static{...}codeblock:{...}example:publicclassStaticTest2{//静态代码块static{System.out.println("静态代码块执行");}//代码块{System.out.println("类代码块执行");}publicstaticvoidmain(String[]args){//创建一个示例StaticTest2staticTest2=newStaticTest2();}}1.3.2特点及场景静态代码块特点:类加载执行,只执行一次场景:做一些静态资源加载代码块特点:每次创建实例和调用构造函数时执行,并在调用之前执行构造函数。场景:初始化实例资源1.4注意事项静态关键字主要用在工具类和常量中。在实际开发中,工具类是必不可少的。static关键字也可以修饰类,这会涉及到内部类。下一章会说明,静态方法只能访问静态成员变量,不能访问实例成员变量。实例可以访问静态成员this关键字不能用在静态方法中(下面介绍)2.关键字this、super和extends关键字this和super主要体现在继承上。this代表当前实例,super代表父类。java中提供了关键字extends使一个类与另一个类建立继承关系,被继承的类是父类,被继承的类是子类。被继承的类(子类)可以直接使用父类的属性和成员方法,大大提高了代码的复用性。2.1继承(extends)格式:publicclassclassnameextendsparentclassclassname{...}优点:提高代码复用性,减少冗余代码增强代码扩展性设计规范:提取类之间相同的属性子类不要把唯一的属性放在父类。所有的类设计都符合面向对象的逻辑。2.2继承特性。子类可以继承父类的属性和行为,但不能继承父类的构造函数。一个父类(很符合现实生活)不支持多重继承,但是支持多层继承。java中的所有类都是Object的子类。子类可以继承父类私有成员变量,但不能直接访问(通过公共方法和结构)2.3继承成员访问访问子类中的成员(就近原则)先访问子类局部作用域再子类成员访问父类成员访问没有一个上面会报错,如果subclassparentclass出现同名成员,则优先使用子类。如果要调用父类,格式如下:super.父类成员变量/父类成员方法2.4方法重写简介:当子类继承父类时,子类实现了与父类相同的方法,我们称重写方法为子类方法。格式:当子类重写父类的方法时,需要在方法上加上@override注解。要求:①重写的方法必须和父类方法一样,除了名称和参数列表。②私有方法不能被覆盖。③子类重写方法时,访问权限必须大于等于父类方法的访问权限。示例:publicclassPeople{privateStringname;publicvoidshowName(){System.out.println("我的名字:"+name);}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}}publicclassTeacherextendsPeople{publicTeacher(){super.setName("Tome");}@OverridepublicvoidshowName(){System.out.println("我是老师。Mynameis"+getName());}publicstaticvoidmain(String[]args){Teacherteacher=newTeacher();teacher.showName();}}2.5子类构造函数当子类构造函数执行时都执行首先是父类的默认构造函数,子类构造函数的第一行默认是super(),如果父类没有默认构造函数会报错,如果父类没有构造函数,父类构造函数也可以手动调用。(例子:super(param...))2.6this和super关键字访问成员构造函数说明thisthis.membervariable/this.methodname(...)this(...)此类构造函数表示当前调用类对象引用supersuper.member变量/super.方法名(...)super(...)父类构造函数表示当前调用类对象父类引用注:this(...)和super(...)only可以放在方法的第一行,所以这两个方法不能出现在同一个方法中。3.类执行顺序//父类publicclassPeople{privateStringname;私人字符串性别;私人年龄;static{System.out.println("执行人物静态代码块");}{System.out.println("执行人员代码块");}publicPeople(){System.out.println("执行人员构造函数");}//获取和设置}//子类publicclassStudentextendsPeople{privateintstudentId;私人字符串亲;static{System.out.println("执行学生静态代码块");}{System.out.println("执行学生代码块");}publicStudent(){System.out.println("执行学生构造函数");}//获取和设置}//测试类publicclassTest{publicstaticvoidmain(String[]args){Studentstudent=newStudent();}}运行Test类查看执行结果:执行People静态代码块执行Student静态代码块执行People构造函数执行Student代码块执行Student构造函数希望大家喜欢,收藏,支持,支持!源码【GitHub】【码云】