代码块&继承&final关键字
代码库:
1.用大括号包起来的一段代码,放在不同的位置,有不同的名称,有不同的作用,有不同的执行时机。
2.分类在:
局部代码块
构造代码块
静态代码块
同步代码块(多线程)
局部代码块:
1.格式:使用大括号抱起来的一段代码。
2.位置:方法中
3.作用:限定变量的生命周期
在局部代码块中声明的变量,只能在局部变量的范围中使用,一旦出了局部代码块的大括号,变量就不能继续使用了
某个变量一旦不能使用了,就会被回收,节省内存空间
4.注意事项:如果实在局部变量代码块中声明了变量,会减少变量的生命周期,出了局部代码块就无法继续使用局部代码块中声明的变量
如果是在局部代码块中修订了局部代码块外声明的变量,局部代码块结束之后,并不会消除局部代码块对这个变量的修改。
class Demo01_局部代码块 { public static void main(String[] args) { int i = 10; { System.out.println(i); i = 20; int j = 100; System.out.println(j); } System.out.println(i);//20,局部代码块只对其中声明的变量有效果,对于变量的使用还是和以前一样 //System.out.println(j);不能访问局部代码块中声明的变量 } }
构造代码块:
1.格式:使用大括号包起来的一段代码
2.位置:类中方法外
3.作用:用于给成员变量赋初始化值
4.构造方法代码块的执行说明:
1.在创建对象的时候执行,由JVM默认调用
2.在构造方法执行之前执行
3.任意一个构造方法执行之前,都会执行一次构造代码块的内容
4.如果每个构造方法都执行的内容,提取到构造代码块中。
代码示例:
import java.util.Date; import java.text.SimpleDateFormat; class Demo02_构造代码块 { public static void main(String[] args) { Person p = new Person(); p.show(); Person p2 = new Person("lisi", 24); p2.show(); System.out.println("----------------------"); Man m = new Man("老王"); m.show(); } } class Person { private String name; private int age; { //name = "zhangsan"; //age = 23; System.out.println("构造代码块"); } public Person() { System.out.println("空参构造"); } public Person(String name, int age) { System.out.println("有参构造"); //this.name = name; //this.age = age; } public void show() { System.out.println(name + ".." + age); } } class Man { private String name; private String gender; private String createTime; { gender = "m"; //获取系统时间,并转换成相应格式的字符串,并且给成员变量赋值 long time = System.currentTimeMillis();//获取当前系统时间作为创建时间 Date d = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); createTime = sdf.format(d); } public Man() {} public Man(String name) { this.name = name ; } public void show() { System.out.println(name + "..." + gender + "..." + createTime); } }
静态代码块
1.格式
static{
代码块内容
}
2.位置:类中方法外
3.作用:用于给静态的成员变量赋初始化值
用于执行那些只需要执行一次的代码,例如驱动加载等等
4.执行特点:
1.随着类的加载而执行
2.类只加载一次,所以静态代码块只执行一次。
3.执行的时机最早:早于所有的对象相关内容。
执行顺序:静态代码块->初始化代码块(构造方法代码块)->构造方法
代码示例:
class Demo03_静态代码块 { static { System.out.println("测试类的静态代码块执行了");//1 } public static void main(String[] args) { System.out.println("主方法执行了");//2 StaticDemo sd1 = new StaticDemo(); StaticDemo sd2 = new StaticDemo(666); } } class StaticDemo { static { System.out.println("StaticDemo的静态代码块执行了");//3 } { System.out.println("staticDemo的构造代码块执行了");//4,6 } public StaticDemo() { System.out.println("StaticDemo的空参构造执行了");//5 } public StaticDemo(int i) { System.out.println("StaticDemo的有参构造执行了");//7 } }
继承:
1.继承的概念:让类与类产生关系,父子类的关系。
2.关键字:extends 扩展,增加,继承
3.父类和子类:
父类:被继承的类,超类(super),基类(base)
子类:用于继承的类,派生类。
代码示例:
class Demo05_有继承的情况 { public static void main(String[] args) { Cat c = new Cat(); c.setColor("black"); c.setAge(3); System.out.println(c.getColor() + "..." + c.getAge()); } } class Animal { private String color; private int age; public void setColor(String color) { this.color = color; } public String getColor() { return color; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void sleep() { System.out.println("睡觉"); } } class Cat extends Animal { } class Dog extends Animal { }
创建对象的顺序:
创建子类对象时,先创建父类的对象,直到创建到Object类为止。
由于父类加载到内存中,因此子类可以使用父类的非Private修饰的属性与方法。
但父类不能使用子类的属性和方法,和访问修饰符无关。
Object类是所有类的父类(除自身以外)
重写:@Override 重写的注解
父类方法不能满足子类的需求,子类中重写父类的方法。
重写与重载的区别:
重载:在一个类中,方法名相同,参数列表不同
重写,至少两个类,方法名相同,参数列表相同
继承的好处与弊端:
1.好处:提高了代码的重用性
提高了代码的可维护性
是多态的前提
2.弊端:提高了代码的耦合性(松耦合,解耦合)
耦合性:事物与事物之间的依赖关系,互相影响的程度。
3.开发原则:面向对象最终要实现的目的
高内聚(一个对象可以自己完成各种事情) 低耦合(对于其他代码的依赖性非常低) 代码的复用性高
继承的注意事项:
1.私有的成员不能被继承
父类中有一些私有成员,不能在子类中直接使用。
其实在子类对象中,任然包含了父类中定义的私有成员变量
只不过在子类中,不能直接访问父类中定义的私有成员变量。
2.父类中的构造方法不能继承
代码示例:
class Demo06_继承的注意事项 { public static void main(String[] args) { Student stu = new Student(); } } class Person { private String name; private int age; public Person() {} public Person(String name, int age) { this.name = name; this.age =age; } } class Student extends Person { public void show() { //System.out.println(name + "..." + age); } }
final关键字:
1.单词含义:最终的,最后的,不能改变的。
2.final关键字,可以修饰类,方法,变量。
3.修饰类:表示一个最终类,表示不能有子类(不能被其他类继承)
一旦一个类不能被继承,那么其中所有方法都不能被重写
但是不影响当前类的方法被调用
修饰一个方法:表示这是一个最终方法,该方法不能被重写
修饰变量:表示一个最终变量,只能赋值一次。
- [认证授权] 3.基于OAuth2的认证(译)
- [Asp.Net Core] 1. IIS中的 Asp.Net Core 和 dotnet watch
- kafka数据迁移实践
- HDFS 2.x 磁盘间数据均衡的一种可行办法
- Batik渲染png图片异常的bug修复全程记录
- Web应用服务器安全:攻击、防护与检测
- 基于Go Packet实现网络数据包的捕获与分析
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- Hive 时间转换函数使用心得
- Flume-Hbase-Sink针对不同版本flume与HBase的适配研究与经验总结
- 利用Flume 汇入数据到HBase:Flume-hbase-sink 使用方法详解
- 浅谈保证软件工程质量的一些心得体会
- 基于ELK的nginx-qps监控解决方案
- 2017年年度最烂密码排名
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法