【Java学习】静态static&继承

一、静态 static

(一)定义

static是静态的意思,static可以修饰成员变量或者修饰方法。

static关键字的使用,它可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的,放在静态区中,没有static修饰的成员变量和方法则是属于对象的。

static关键字在Java开发非常的重要,对于理解面向对象非常关键。

(二)static修饰成员变量

有static修饰成员变量,说明这个成员变量是属于类的,这个成员变量称为类变量或者静态成员变量。因为类只有一个,所以静态成员变量在内存区域中也只存在一份。所有的对象都可以共享这个变量。

定义格式:

修饰符 static 数据类型 变量名 = 初始值;

//举例
public class Number {
    private static int num = 1;
}

静态成员变量的访问:

直接用类名.变量名访问,或者先创建一个类的对象,再用对象名.变量名访问

public static void  main(String[] args){
    System.out.println(Number.num); //1

    Number number = new Number;
    System.out.printl(number.num)
}

区分:

无static修饰的成员变量属于每个对象的, 这个成员变量叫实例变,实例成员变量属于每个对象,必须创建类的对象才可以访问。

(三)static修饰成员方法

有static修饰成员方法,说明这个成员方法是属于类的,这个成员方法称为类方法或者静态方法,直接用类名访问即可。因为类只有一个,所以静态方法在内存区域中也只存在一份。所有的对象都可以共享这个方法。

与静态成员变量一样,静态方法也是直接通过类名.方法名称即可访问。

定义格式:

public class Student{
 
    public static void study(){
    	System.out.println("学生在学习");   
    }
}

访问:

public static void  main(String[] args){
    Student.study();
}

区分:

无static修饰的成员方法属于每个对象的,这个成员方法也叫做实例方法

需要注意的是:实例方法是属于每个对象,必须创建类的对象才可以访问。

格式:对象.实例方法

注意事项:

1、类方法中可以直接访问类成员,不可以直接访问实例成员

2、实例方法中及可以直接访问类成员,也可以直接访问实例成员

3、实例方法中可以出现this关键字,类方法中不可以出现this

(四)类方法的常见应用场景

类方法最常见的应用场景是做工具类。

在开发中会有一些非常实用的、具有独立功能的方法,而且希望这些方法可以被重复使用,就像一个个小工具一样 这些方法所在的类,就称为是工具类,而工具类中的方法,习惯上设置为类方法。

public class XxxxUtil {
    //求最大值
    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    //求最小值
    public static int min(int a, int b) {
        return a < b ? a : b;
    }
}

相比于实例方法,类方法可以直接用类名调用,比较方便,而且不用创建对象,节省内存。

工具类没有创建对象的需求,建议将工具类的构造器进行私有。

(五)代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块分为两种:

1、静态代码块

格式:static { }

特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次

作用:完成类的初始化,例如:对类变量的初始化赋值

2、实例代码块

格式: { }

特点:每次创建对象时,执行实例代码块,并在构造器前执行

作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值

二、继承

(一)概述

多个类中存在相同属性和行为时,我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可,其中,多个类可以称为子类,单独被继承的那一个类称为父类超类(superclass)或者基类

继承:就是子类继承父类的属性行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

好处:

1、提高代码的复用性(减少代码冗余,相同代码重复利用)

2、使类与类之间产生了关系

继承的格式

class 父类 {
	...
}

class 子类 extends 父类 {
	...
}

注意:Java是单继承的,一个类只能继承一个直接父类,跟现实世界很像,Java中的子类是更加强大的。可以多层继承,例如一个儿子不能同时有两个爸爸,但是可以有爷爷,那么儿子的能力就等于爷爷和爸爸和自己的相加

(二)权限修饰符

权限修饰符用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围。

private:修饰的成员只能被本类中的成员访问

缺省(什么都不写):修饰的成员只能被本类和同包中的类的成员访问

protected:修饰的成员能被本类、同包中的类、子孙类中的成员访问

public:修饰的成员能被任意位置的成员访问

(三)方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法。声明不变,重新实现

重写后,方法的访问会遵循就近原则

注意事项:

1、在重写的方法上标注Override注解,可以指定java编译器检查我们方法重写的格式是否正确

2、子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限( public > protected > 缺省 )

3、重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小

4、私有方法、静态方法不能被重写,如果重写会报错

示例代码:

父类Father有一个makeFriend方法,子类Son继承后觉得这个方法不好,便对该方法重写。重写的方法名称,返回值类型,参数列表(如果有的话)都和父类中的方法相同。

public class Demo {
    public static void main(String[] args) {
        Son son = new Son();
        son.makeFriend();
    }
}

class Father{
    //交朋友
    public Father makeFriend(){
        System.out.println("通过写信交朋友");
        return null;
    }
}

class Son extends Father{

    //交朋友
    @Override
    public Father makeFriend(){
        System.out.println("通过微信交朋友");
        return null;
    }


}

(四)子类中访问其他成员的特点

1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的:

先子类局部范围找,

然后子类成员范围找,

然后父类成员范围找,如果父类范围还没有找到则报错。

2、如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的,可以通过super关键字,指定访问父类的成员:super.父类成员变量/父类成员方法

3、super和this的用法格式

this.成员变量    	--    本类的
super.成员变量    	--    父类的

this.成员方法名()  	--    本类的    
super.成员方法名()   --    父类的

(五)子类构造器的特点

1、子类中的全部构造器,都必须先调用父类的构造器,再执行自己

2、super(...) -- 调用父类的构造方法,根据参数匹配确认

3、this(...) -- 调用本类的其他构造方法,根据参数匹配确认

4、this和super不能同时出现,他们都必须是在构造方法的第一行

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值