java 静态代码块 继承_JAVA--OOP 代码块&继承&final

技术基础还是重要的..分享一下以前的笔记,梳理一下概念。

1.代码块

分为4种:局部代码块,构造代码块,静态代码块,同步代码块

1.1 局部代码块

“局部”和方法有关。用于限定变量的作用域,控制其生命周期。方法弹栈后,局部代码块中变量释放。用于及时释放内存,提高内存利用率。

1.2 构造代码块

在类中方法外出现;多个构造方法方法中相同的代码存放到一起。即,class中,方法外单独定义一对“{}”,里面写的内容就是构造代码块。

什么时候执行这个代码块?每次调用构造(创建对象时,new的括号里有参或无参均可),执行,并且在构造方法前执行。

运用场景

当这个类里所有对象,都需要具备同一个方法时,则在该类定义时,将所需执行代码用“{...}”括起,即可在创建对象时执行。

提高代码复用性。但开发中用得不多,面试可能会问。

1.3 静态代码块

在类中方法外出现,并加上static修饰;用于给类进行初始化,在类加载的时候就执行,并且只执行一次。如果是在有main函数的类里,该代码块会比static 的main函数还要提前执行。

运用场景

给类做初始化的,即,一般用于加载驱动

(一个程序启动后,驱动只要加载一次就行。而不是说游戏每创建一个角色都要再重新加载驱动。当.class加载到内存方法区时,执行一次)

1.4 同步代码块

和线程有关

2.继承(Extends)

2.1 运用场景

猫类和狗类,可以继承共同的“动物类”。动物类来封装猫、狗它们共有的属性变量和函数方法。

越往父类,就越“聚类”、抽象。越往子类,越具化,方法和变量可能越多。

2.2 好处

(1)封装,多次调用该封装。提高代码的复用性。

(2)提高代码可维护性,利于纠错

如果要在Animal里增加一个属性,则Cat和Dog里就会同时都增加,而不用逐一增加。

(3)让类和类之间产生关系,为“多态”做铺垫。

要想用多态,必须先有继承

2.3 弊端

增加了两个类(父类和子类)的耦合性。而开发原则是“高内聚、低耦合”(自己能完成,不求人一起做)

2.4 形式

Class Animal{

int legs_count;

public void eat(){...}

public void sleep(){...}

}

Class Cat extends Animal{}

Class Dog extends Animal{}

2.5JAVA类继承的特点

(1)Java只支持单继承,不支持多继承。(编译就会报错)

(而有些语言是支持多继承,格式:extends 类1,类2,...)

原因:如果C类能同时继承A和B,而A和B都有参数一致的同名函数,执行不同的功能。这样C就会乱。——多继承会有安全隐患!!

(2)Java支持多层继承(继承体系)

这样N层孙子类节点,所拥有的东西(属性、方法等)会越来越多

如果想使用这个体系(爷爷-父亲-孙子-重孙...)最全的功能,则直接创建“重孙”(最底的叶子)的实例对象。

如果想看该体系最共性的功能,就看曾祖父类(最顶端的类)

什么时候用继承?

继承其实体现的是一种关系:"is a"。假设有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

2.6 this与super的使用方法

都代表什么

this:代表当前对象的引用,谁来调用我,我就代表谁

super:代表当前对象父类的引用

使用区别

* a:调用成员变量

* this.成员变量 调用本类的成员变量,也可以调用父类的成员变量

* super.成员变量 调用父类的成员变量

* b:调用构造方法

* this(...)调用本类的构造方法

* super(...)调用父类的构造方法

* c:调用成员方法

* this.成员方法 调用本类的成员方法,也可以调用父类的方法

* super.成员方法 调用父类的成员方法

Son s=new Son(); s.getName();//如果Son里没有getName()方法,那么就会找父类、祖父类、曾祖父类等等,直到找到。就近原则使用。

2.7有关继承的构造函数

* 子类中所有的构造方法默认都会访问父类中空参数的构造方法,而且是先运行父构造方法,再运行子构造方法。为什么?

* 因为子类会继承父类中的数据,可能还会使用父类的数据。

* 所以,子类初始化之前,一定要先完成父类数据的初始化,而构造函数都是用于初始化数据的。类似:

Class Son{

super();//先调用父类的无参构造,父类也一样再调用父类的父类无参构造。这句不写,系统也是会默认加进去。

public Son(){...}

}

* 其实:每一个构造方法的第一条语句默认都是:super()

Object类:最顶层的父类。如果不写继承的话,默认就继承Object类。

2.8注意事项子类只能继承父类所有非私有的成员(成员方法和成员变量)

虽然子类还是可以通过get\set方法来访问私有变量,但父类的私有方法是绝对不能访问的。子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。

类名都不一样,而构造方法必须和类名一样,所以不可能继承构造方法来把自己的替换成父的。而且,同一个文件夹(包)里,不能有同名函数,Father构造方法不能出现在两个类里。不要为了部分功能而去继承

如果子类和父类有同名函数,则按就近原则

子类中的show会输出子类变量。但继承就是为了直接用父类的,子类替换掉,这样就没继承的意义了。

注意

调用构造方法this(...)和super(...),必须放在子类构造方法里的第一句位置。

2.10重写成员方法

形式:在子类里对一摸一样的方法,重写代码块

如果重写了xxx(),则调用http://son.xxx()会执行子类的

与重载overload的区别:

方法重写:子类中出现了和父类中方法声明一模一样的方法,参数列表也一样,全部一摸一样!与返回值类型有关,返回值是一致(或者是子父类)的。

方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关

应用场景

比如升级后的手机类,有一些功能不再适用了,那么就在后期子类继承父类后,重写父类的这些需要更新的方法。

但如果定义子类功能后,仍然想用父类原先的部分功能,可在子类方法里,直接http://super.xxx()即可。

注意事项

父类中私有方法不能被重写

子类重写父类方法时,访问权限不能更低 比如父类是public,子类变成private或default是错的,最好和父类保持一致。

父类静态方法,子类也必须通过静态方法进行重写,否则编译报错。

子类重写父类方法的时候,最好声明一模一样

3.Final

用法

修饰符,被修饰的不能不被改或继承若用于修饰类,类不能被继承希望类里所有定义的方法,都不被别人继承后改写

final Class Son(){}

若用于修饰变量,变量就变成了常量,只能被赋值一次希望别人接着做项目时,对π等变量有同一的认知解释:

public static final int FINAL_NUM; //final修饰变量时,一般会搭配public static

若用于修饰方法,方法不能被重写希望被继承后,这个方法不会被son类修改

public final void func(){}//如果是跟主方法并列放在一个类里的,都配上static省得再创建对象开堆空间了。

修饰局部变量

基本数据类型定义final,则值不能被改变。引用类型定义final,则地址值不能被改变,而对象中的属性可变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值