JavaSE--难点剖析

1、接口与抽象类:

  • 抽象类里可以没有抽象方法也可以有具体的方法和属性, 接口只能有抽象方法和不可变常量,但是不用abstract关键字。普通类不能有抽象方法。

  • 一个实体类若是继承了抽象类,则必须实现抽象类中所有的抽象方法。若是实现了接口则必须实现接口的所有方法。

  • 在接口中的方法,若是用static 和default修饰,则可以不实现。

  •  接口可以继承(extends)接口,而且支持多继承。

 

2、上转型对象

  •  父类声明子类实例化的对象,即为上转型对象。也可以理解为父类引用指向子类对象。

  •  上转型对象只能访问父类原有的方法或子类重写父类的方法,而不能访问子类新增的方法。

        使用上转型对象的好处:

        如果有个方法返回的是父类类型,而我们使用子类类型接收的话,强转会报错。这时我们只能使用上转型对象。

    public static SuperClass t() {

        SuperClass s = new SuperClass();

        return s;

    }

    public static void main(String[] args) {

        SubClassA s1=new SubClassA();

        s1=(SubClassA) t();//会报错

        SuperClass s2=new SubClassB();

        s2=t();

            还有,父类强转子类类型:

        SuperClass s=new SubClassA();

        SubClassA s1=(SubClassA) s;//不会报错

        SuperClass s2=new SuperClass();


        SubClassA s3=(SubClassA) s2;//会报错

3、类变量和成员变量:

  • 类变量(静态变量):由static修饰的变量称为静态变量,其实质上就是一个全局变量,也叫类变量。静态变量随着类的加载而存在,随着类的消失而消失。 静态变量数据存储在方法区(共享数据区)的静态区。

  • 成员变量(实例变量):成员变量随着对象的创建而存在,随着对象的回收而释放。 成员变量存储在堆内存的对象中。

  •  接口中的定义的常量即使不是static类型的依旧可以直接通过“接口.变量名”的方式调用。其实现类也可直接调用。

  • 抽象类中定义的常量与普通类相同,必须是static类型才能直接调用。       

 

4、静态成员的特点:

  • 随着类的加载而加载,也就是,说静态会随着类的消失而消失,说明静态的生命周期最长。

  • 在方法区内存中。

  • 优先于对象的存在,明确一点:静态是先存在的对象是后存在的(因为虚拟机加载类的时候就初始化了,而实例对象是在执行new操作的时候才被初始化,这也是为什么非静态成员不能访问静态成员,而静态成员可以访问非静态成员)

  • 被所有对象共享

  • 可以直接被类名直接调用

  • 静态方法只能访问静态成员(包括成员变量和成员方法),非静态方法可以访问静态也可以访问非静态

  • 静态方法中不可以定义this,super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字

5、限定修饰符:

        Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。

 

public

protected

default

private

同类

同包

 

子类

 

 

不同包不是子类

 

 

 

6、重写与重载:

重写和重载其实是java多态性的体现,重载实现的是编译时的多态性,重写实现的是运行时的多态性

重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。

  • 方法名相同而参数列表不同。

  • 与返回值类型无关;与访问修饰符无关;

重写:在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

  • (名字、形参)方法名相同;参数列表相同;参数顺序也必须相同。 //两同

  • (返回值)子类的返回值类型应该与父类方法的返回值类型相同或是它的子类

  • (异常)子类抛出的异常类型应该小于或等于父类抛出的异常 //两小

  • (访问权限)子类的访问修饰符必修要大于或者等于父类的访问修饰符 //一大

7、值传递与引用传递

  • java中原始数据类型都是值传递,传递的是值的副本,形参的改变不会影响实际参数的值。

  • 引用数据类型利用引用传递,包括(String、数组、集合、类对象)等类型,形参与实参指向的是同一内存地址,因此形参的改变会影响实参的值。

注:简单来说String是引用传递,但由于String都是final类型,所以String不能被改变,当我们对String对象进行改变时,虚拟机会在堆内存中新建一个String对象,方法中的变量将会指向这个新地址,所以原地址的值不会被改变。

详解:引用传递的时候,java虚拟机都是把实参的地址复制一份传给形参,所以形参被改变的时候实参也被改变,而由于String的不可变性,我们在尝试改变原有String的时候,java会分配一个新的内存地址给新的String对象,而原地址所指向的String对象并没有被改变。所以String对象在做引用传递的时候,java虚拟机只是重新分配一个内存地址来指向新的String对象,原来地址并没有被改变。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值