JAVA选择题笔试:static成员与非static成员、父类子类方法的继承、接口与抽象类、final的使用

0、前言

        本文针对一些java基础知识的一些考点做出解析。

1、静态成员 与 非静态成员

        静态变量与静态方法都是静态成员。

 先说静态变量与普通成员变量的区别,例如如下两个变量:

public class Demo {
    public static String A = "静态变量";
    public String B = "实例变量,又称成员变量";
}

        A是静态,B是成员,从jvm层面来讲,他们有以下区别:
理解原理:

  1. 静态变量是在类加载时创建的:随着类的消失而消失,静态变量与类共存亡。
    成员变量是在对象创建后而存在的,:随着对象被回收而释放,成员变量与对象共存亡。
  2. 由第一点可推导:

    静态变量可以被对象调用,也可以通过类名直接访问(因为无需创建对象static变量就存在)

    成员变量因为是在类的实例化过程中创建的,所以需要通过类的实例(也就是对象)调用,没有实例化就没法调用。
     
  3. 静态方法内不能直接调用非静态方法,因为没有创建实例对象(如果调用,将不知道非静态方法属于哪个对象,所以会报错。)
    public class Demo {
        public static void staticMethod() {
            // 直接调用非静态方法:编译报错
            instanceMethod();
        }
        public void instanceMethod() {
            System.out.println("非静态方法");
        }
    }

    相对的,成员方法(非静态方法)能够直接调用静态方法。

总结:静态方法只能访问静态成员(包括静态变量和静态方法)
           实例方法则可以访问实例成员(包括实例变量和实例方法)以及静态成员。

2. 父类子类方法的继承重写问题

         看一个简单的例子,我们知道,子类重写父类方法必须”三个同“的特点:
         返回类型、名称、输入参数都相同。

class A{
    public void sb(){
        System.out.println("A.sb");
    }
}
class B extends A{
//1.普通的重写
//    public void sb(){
//        System.out.println("B.sb");
//    }
    
//2.名称、输入参数一样,但返回类型不同:重写失败。编译错误
//因为虽然返回类型不同,但系统调用sb的时候无法区分是父子哪个sb方法,并且这也不是方法重载。
//但要注意,如果返回类型是父类的派生类,也是可以的。
    public int sb(){
        System.out.println("BBB");
        return 10;
    }

//3.只要输入参数不同,就已经不是同一个sb方法,尽管名称都叫sb:
// 不是重写,但能编译,相当于新方法(即,方法重载)
// 例如,我们可以通调用sb(10)和sb()这两种方式对应两个sb方法,这是可以区分的
    public void sb(int input){
        System.out.println(input);
    }
//同理:
    public int sb(int input){
        System.out.println(input);
        return 1;
    }
}

其他补充:

        只有返回类型不同的方法并不足以使方法成为重载,重载要求参数列表必须有所区别。

3、接口与抽象类

接口的性质:
        接口内的字段(常量)类型都必须是public static final的。Java8开始,可以省略,直接定义常量。如int a = 1;

区别:

  1. 定义方式:抽象类使用 abstract 关键字定义,可以包含抽象方法和具体方法;接口使用 interface 关键字定义,只能包含抽象方法和常量。

  2. 实现方式:一个类可以继承(extends)一个抽象类,并且可以同时实现多个接口(implements)。

  3. 构造方法:抽象类可以有构造方法,而接口不能有构造方法。抽象类的构造方法在被子类实例化时会被调用。

  4. 方法实现:抽象类中的抽象方法可以由子类选择性地实现或覆盖,而接口中的所有方法必须在实现类中被实现

  5. 属性和变量:抽象类可以有实例变量、静态变量和普通方法,而接口只能有常量(public static final)和抽象方法。

  6. 设计目的:抽象类用于创建具有共同特征的类之间的继承关系,它可以提供默认的实现和通用的行为;接口用于定义类应该具备的行为,以实现多态性和代码重用。

  7. 多继承:一个类只能继承一个抽象类,但可以实现多个接口。这是因为Java不支持多重继承,但可以通过实现多个接口来达到类似的效果。

4. 数据类型大小

        红字代表字节数,1字节==8位

 

 5.final与static

        对于final类型的变量,如果不加static,可以有两种方式给它赋值:
        (1)声明变量时直接赋值(2)在构造方法中完成赋值(全部的构造方法都得赋值)

        而如果是static类型的final变量,那么类初始化的时候就必须赋值了 ,所以只有"方法(1)"

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好奇的7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值