java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括
final修饰的类不允许被继承。
一个类不能既是final的,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,两者矛盾。
final修饰方法
final修饰方法,表示该方法不能被子类中的方法覆写Override。
final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
final修饰变量
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化;
如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。
final修饰一个成员变量(属性),必须要显示初始化。
这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
当函数的参数类型声明为final时,说明该参数是只读型的。
super的用法
昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识。还是把它写下来,为大家更好的认识提供一点思路。
1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量;
2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值;
3)整个调用的过程和递归调用函数有点类似,不断充气球,直到整个气球膨胀起来,不断的深层递进,遇到停止标记,逐层的跳出来。
写了段代码,解释我上面的叙述:
1 class JavanTiger {
2 int age; // 年龄
3 int hight; // 身体高度
4
5 public JavanTiger() {
6 print();
7 this.age=2; //这里初始化 age 的值 ,但递归返回的时候,这个值会被覆写
8 }
9
10 public JavanTiger(int age) {
11 this(); // 调用自己的第一个构造函数,下面的两个语句数不执行的
12 this.age = age;
13 print();
14 }
15
16 public JavanTiger(int age, int hight) {
17 this(age); // 调用自己第二个构造函数 ,下面的两个语句数不执行的
18 this.hight = hight;
19 print();
20 }
21
22 public void print() { //打印函数
23 System.out.println("I'am a " + age + "岁 " + hight + "尺高 tiger!");
24 }
25 public static void main(String[] args) {
26 new JavanTiger(3,3);
27 }
28 }
29 //output
30 //I'am a 0岁 0尺高 tiger!
31 //I'am a 3岁 0尺高 tiger!
32 //I'am a 3岁 3尺高 tiger!
个人理解就是这样了,可能里面还有问题,比如构造函数递归调用和程序函数递归调用的机制是否似乎相同的?构造函数同对象一起产生,也就是同时会分配内存空间出来,那门这样的递归调用会不会打乱分配内存的顺序?希望看到的大牛们拍板,给个最好的解释。
今天要总结的是 super 这个关键字的使用,super 在构造函数中出现的时候一般是当前这个类继承了其他的类,super 的出现就是为了调用父类的构造函数,贴段代码先
1 class Tiger {
2 int age; // 年龄
3 int hight; // 身体高度
4
5 public Tiger() {
6 print();
7 }
8
9 public void print() {
10 System.out.println("I'am a " + age + "岁 " + hight + "尺高 tiger!");
11 }
12 }
13 public class JavanTiger extends Tiger {
14 public JavanTiger() {
15 super(); // 调用父类无参数的构造函数
16 }
17 public static void main(String[] args) {
18 new JavanTiger();
19 }
20 }
其实在类JavanTiger 中的构造函数中的 super()可以不写,JAVA会默认调用父类的无参数的构造函数,但如果父类没有定义无参数的构造函数,没有语法错误,程序会自动退出,没有任何打印语句,这时候你需要手动调用其他父类的构造函数,贴段代码:
1 class Tiger {
2 int age; // 年龄
3 int hight; // 身体高度
4
5 public Tiger(int age) {
6 this.age = age;
7 print();
8 }
9 public void print() {
10 System.out.println("I'am a " + age + "岁 " + hight + "尺高 tiger!");
11 }
12 }
13 public class JavanTiger extends Tiger {
14 public JavanTiger() {
15 super(1); // 调用父类有参数的构造函数
16 }
17 public static void main(String[] args) {
18 new JavanTiger();
19 }
20 }
这段代码中的 super(1)必须要写进去,否则编译器会报错。所以我简单的总结了一下,“this()是调用自己其他的构造函数,super()是调用自己继承的父 类的构造函数“,如果只想调用默认无参数的父类构造函数,不用在子类的构造函数当中写出来,但是实际编程的时候,总是会忽略这一点。
那门这两个关键字能不能同时出现在子类的一个构造函数当中纳?答案肯定是不能。先说下自己的理解:
1)在新建一个基类的时候,不论递归调用几次自身的构造函数,最终你都会去调用父类的构造函数,(不是显式调用的话,系统会调用默认无参数的父类构造函数);
2)JAVA 中规定使用 this 和 super 时必须放在构造函数第一行,只有一个第一行;只能使用一个要不然死循环
转载:http://www.cnblogs.com/java-class/archive/2012/12/20/2826499.html
This的用法
用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属 性和方法纳?呵呵,JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法。先来个简单的例子:
public classThisDemo {
String name="Mick";
public voidprint(String name){
System.out.println("类中的属性 name="+this.name);
System.out.println("局部传参的属性="+name);
}
public static voidmain(String[] args) {
ThisDemo tt=newThisDemo();
tt.print("Orson");
}
}
关于返回类自身的引用,Thing in Java有个很经典的例子,通过this 这个关键字返回自身这个对象然后在一条语句里面实现多次的操作,还是贴出来。
public classThisDemo {
intnumber;
ThisDemo increment(){
number++;
return this;
}
private voidprint(){
System.out.println("number="+number);
}
public static voidmain(String[] args) {
ThisDemo tt=newThisDemo();
tt.increment().increment().increment().print();
}
}
那也应该在一个类中定义两个构造函数,在一个构造函数中通过 this 这个引用来调用另一个构造函数,这样应该可以实现,这样的实现机制在实际做应用开发的时候有会有什么样子的用处纳?贴下写的代码:
public classThisDemo {
String name;
intage;
publicThisDemo (){
this.age=21;
}
public ThisDemo(String name,intage){
this();
this.name="Mick";
}
private voidprint(){
System.out.println("最终名字="+this.name);
System.out.println("最终的年龄="+this.age);
}
public static voidmain(String[] args) {
ThisDemo tt=new ThisDemo("",0); //随便传进去的参数
tt.print();
}
}
看上面这段代码虽然很短,理解起来似乎也很顺理成章,在有参数的构造函数中赋值name 在无参数的当中赋值age属性。但我个人觉得其中有点问题,实例化一个类应该先为对象ThisDemo分配内存,先调用构造函数 ThisDemo(String name,int age),执行到第一行的时候,调用ThisDemo()构造函数,也就是说这里应该会有两个内存空间的,一个是ThisDemo(String name,int age)执行到一点的空间和另一个是ThisDemo()执行空间,为什么最后打印出来的结果是都实例化了一个对象中的两个属性name和age纳?请大 牛赐教!
总结一下:
1) this 关键字是类内部当中对自己的一个引用,可以方便类中方法访问自己的属性;
2)可以返回对象的自己这个类的引用,同时还可以在一个构造函数当中调用另一个构造函数(这里面上面有个问题)
转载:http://www.cnblogs.com/java-class/archive/2012/12/19/2825463.html
java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括相关推荐
- Java中jar包怎么使用_java中jar包的使用方法
java中jar包的使用方法 发布时间:2020-06-23 11:08:05 来源:亿速云 阅读:162 作者:Leah 这篇文章将为大家详细讲解有关java中jar包的使用方法,小编觉得挺实用的, ...
- java缺省包详解_Java在其它包中无法引用缺省包中的类
1.现象 1.1 问题场景 最近,在写测试代码时,将一个类(这里暂且称为ClassA)放在在缺省包中,也就是说,直接放在了src目录下,没有创建包.然后,将这个类打入了jar文件,提供给另外的工程(这 ...
- Idea一键自动导包设置--导入类中所有包?教你自动更新类中包含的包
在日常的拷贝复用代码中,导包的重复性工作非常繁琐,在这里分享一个idea设置. 动态效果演示: Idea一键自动导包设置--导入类中所有包?教你自动更新类中包含的包 操作步骤: File-->S ...
- java中包的_Java中的包
包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...
- java jar包和war包_java中jar包和war包之间有什么区别
原标题:java中jar包和war包之间有什么区别 jar包 简单地说,JAR(Java Archive)是一种包文件格式.JAR文件具有.jar扩展名,可以包含库.资源和元数据文件. 本质上,它是一 ...
- java.lang包有哪些类_Java中Lang包的工具类有哪些
Java中Lang包的工具类有哪些 发布时间:2020-12-08 16:15:36 来源:亿速云 阅读:76 作者:Leah 今天就跟大家聊聊有关Java中Lang包的工具类有哪些,可能很多人都不太 ...
- java包是什么意思_java中的“包”到底是什么意思?
Java包的概念 为了更好的组织类,Java提供了包机制.包是类的容器,用于分隔类名空间.如果没有指定包名,所有示例都属于一个默认的无名包.Java中的包一般包含相关的类.例如,所有关于车辆的类都可以 ...
- java 不同包 调用_java中不同包之间的调用
<java中不同包之间的调用>由会员分享,可在线阅读,更多相关<java中不同包之间的调用(4页珍藏版)>请在金锄头文库上搜索. 1.建立两个类 PackageA.Packag ...
- Java类有个星号标记_Java中import包带*(星号)问题
今天发现Java中import包时,带*(星号)的一个问题.下面附上代码和截图: 在我的电脑"E:\csdn\"目标下有两个java文件: Print.java和Demo.java ...
最新文章
- 当我们按下电源键,Android 究竟做了些什么?
- Android 计算器
- 学习iBatis时的一个苦逼经历
- 正则表达式||grep的使用
- 吴恩达深度学习 —— 3.3 计算神经网络的输出
- 工厂模式 — 在项目中的用法
- PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
- linux bash 逻辑,Bash 中的逻辑和() | Linux 中国
- 关于RadASM使用编译资源脚本功能无法找到指定头文件的解决方案
- 收款码三合一生成系统源码
- 水星d128路由器虚拟服务器,幻影D128路由器怎么设置?
- 记录一下小米8Root过程
- matlab识别中国象棋棋盘,c – 使用OpenCV在棋盘中检测中国象棋棋子
- 本地搭建Git服务器,两台电脑共享代码如此简单
- PrimeNG之DataTable
- 调查报告:创意行业是否为远程办公做好准备?
- Domino管理中的一些小而有大用处的技巧
- vue3.0 + JsBarcode 循环生成多个条形码(setup语法糖)
- webstorm安装及汉化后无法设置的原因总结
- 【目标检测】将目标检测数据集划分为训练集、验证集与测试集 python代码
热门文章
- python详细的安装教程分享!
- 莆田考计算机二级的学校,二级计算机考试——我的经历,我的感受!
- c语言实现有限域模多项式_有限域计算简述
- 光纤传感器实验模块_准分布式光纤光栅传感器(光纤光栅串)的概念
- python celery异步_python项目_使用异步功能,celery
- 这是我见过最全面的Python装饰器详解!没有学不会这种说法
- Django中pipeline操作Redis数据库
- Python可视化中Matplotlib绘图(2.设置范围、标签、标题、图例(详细参数))
- Java8 ThreadLocal 源码分析
- wxWidgets:wxTimePickerCtrl类用法