Java学习笔记14(面向对象七:final、static)
final:意为最终,不可变,是一个修饰词
有时候一个类地功能被开发好了,不想让子类重写,修改,这里就会用到final关键字
final修饰类:
不可以被继承,但是可以继承其他类
示例:
public final class Fu {
public void show(){
System.out.println("最终类的方法");
}
//这个类不能被继承
//使用方法不变
}
public class Test {
public static void main(String[] args) {
Fu f = new Fu();
f.show();
}
}
final修饰方法:
不可以被子类重写
示例:
public class Fu {
public final void show(){
System.out.println("父类的最终方法");
}
public void function(){
System.out.println("父类的一般方法");
}
}
public class Zi extends Fu {
public void function(){
System.out.println("子类重写父类的一般方法");
}
//不可以重写父类的show方法
}
public class Test {
public static void main(String[] args) {
Zi z = new Zi();
//方法的使用方式没有改变
z.function();
z.show();
}
}
final修饰的变量称为常量,只能被赋值一次:
一次赋值,终身不变
如果final修饰引用数据类型,那么保存变量的内存地址将终身不变
final修饰成员变量:
成员变量保存在堆内存中,是有默认值的,所以final修饰成员变量必须要赋值
由于成员变量的赋值方式有两种:直接赋值;构造方法赋值,所以final修饰的成员变量可以选择其中一种进行赋值
但是要保证只能被赋值一次
示例:
public class Person {
//直接赋值(实际中建议这样方式):
//final int age = 18;
//构造方法赋值:
final int age;
public Person(int age){
this.age = age;
}
}
static:
意义举例:
一个学校里有一群学生对象,他们都有不同的姓名和年龄,但是他们的学校名都是相同的,
创建学生对象的时候,成员变量中的学校名在每次新建对象的时候都会存入堆内存,但是每次存的数据都是相同的,造成了内存的浪费
于是想到,能否将学校名提出来,放到某个地方,让多个对象共享,节省内存
于是,出现了static关键字:
静态多了一种调用方式
被静态修饰的成员,可以被类的名字直接调用
示例:
public class Person {
String name;
static String className;
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.name = "张三";
p2.name = "李四";
p1.className = "一班";
//共享数据的特性:一处改,其他对象跟着改
System.out.println(p2.className);
System.out.println(Person.className);
}
}
//输出:一班
根据这个示例对static内存的分析:
内存中,静态优先于非静态存在的
1.Test.class文件中的main方法进入数据共享区(静态区),
2.Person.class文件中的className变量进入数据共享区,并赋默认值null
3.开始执行,运行main方法,JVM到静态区将main方法复制一份,压栈执行
4.创建对象,堆中开空间存对象,成员变量跟随,静态不进入,因为静态变量早进入了静态区
5.JVM到静态区,找到属于Person类的静态属性className,进行修改等操作
静态的注意事项:
静态不能调用非静态:
原因:声明周期
静态优先于非静态存在于内存在,无法调用不存在的
比如古人无法访问现代人
非静态可以调用静态
比如现代人可以访问古人(可能有点不恰当...理解就行)
静态不能用this,super方法,
同样,静态在创建对象前就存在,不允许访问不存在的
而在实际中,通常静态对静态,非静态对非静态
示例:
public class Student {
private String name;
private static int age;
public static void function(){
//System.out.println(name);
//这里的静态方法不能调用非静态
}
public void show(){
System.out.println(age);
//非静态可以调用静态
}
}
静态修饰应用场景:
本身是一个成员修饰符,可以修饰成员变量,可以修饰成员方法
多个事物之间是否存在共性数据?这里就可以将这个共性数据定义成静态
只要方法没有调用过非静态成员,则将其定义为静态
对象中的静态调用:
这里是之前多态中的一个难点:
示例:
public class Fu {
static int i = 1;
public static void show(){
System.out.println("父类的静态方法");
}
}
public class Zi extends Fu {
static int i = 2;
public static void show(){
System.out.println("子类的静态方法");
}
}
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.i);
f.show();
}
}
/*输出:
1
父类的静态方法
*/
/*
多态中,编译看等号左边的,父类有编译成功,父类没有,编译失败
运行看等右边的,
如果是静态方法,运行的是父类中的静态方法
如果是非静态方法,运行的是子类重写的非静态方法
成员变量:
无论静态非静态,编译运行都是父类的
根本原因:静态属于类,不输入对象
多态性是讨论对象的性质,而静态和对象无关,
*/
最后,
在开发中,有时候需要定义静态常量,并且常量名要求全大写,空格用_代替
固定格式:public static final String THIS_NAME = "XXXX"
Java学习笔记14(面向对象七:final、static)的更多相关文章
- 疯狂java学习笔记之面向对象(七) - super关键字
super有以下两大作用: 1.起限定作用:强制去访问父类的成员(Field.方法) 2.起调用作用:指定/显示调用父类的某个构造器 super调用规则: 1.子类构造器总会调用父类构造器一次,默认情 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- 20145230《java学习笔记》第七周学习总结
20145230 <Java程序设计>第7周学习总结 教材学习内容 Lambda语法概览 我们在许多地方都会有按字符串长度排序的需求,如果在同一个方法内,我们可以使用一个byName局部变 ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- 【原】Java学习笔记018 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系的子类可以 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- 疯狂java学习笔记之面向对象(八) - static和final
一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Fie ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- Java学习笔记:03面向对象-接口_多态
1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...
随机推荐
- 机器学习实践之K-近邻算法实践学习
关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月04日 22:54:26所撰写内容(http://blog.csdn.n ...
- 迪杰斯特拉/dijkstra 算法模板(具体凝视)
#include <iostream> #include <malloc.h> #include <cstring> #include <stack> ...
- SignalR简单Demo
我们实现一个简单的消息通知的Demo 在NuGet中添加SignalR引用 install-package Microsoft.AspNet.SignalR 然后我们创建一个类来引用Hub类 name ...
- 《深入理解计算机系统》【PDF】下载
<深入理解计算机系统>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382303 内容提要 本书主要介绍了计算机系统的基本概念,包 ...
- 《TCP-IP详解卷2:实现》【PDF】下载
<TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...
- for循环语句以及输出语句
action() { int i; //定义变量 lr_start_transaction("submit_answer"); //开始事物 for(i=0; i ...
- DeepLearning.ai学习笔记汇总
第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...
- ubuntu16.04 查询ip,网关,dns信息
用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show
- discuz管理员登录进入后台管理马上跳转到登录界面
昨天尝试了一下这个discuz论坛,感觉还可以.今天刚刚用管理员账户进入后台管理,准备改一改界面熟悉一下,过不了10秒钟.老是马上就退出来了.我想起来了,昨天是在阿里云服务器上面直接登录这个管理员账号 ...
- ArcGIS 网络分析[8] ArcObjects二次开发之底层网络分析开发
基于现有的线要素类.转弯要素类(在地理数据库的要素数据集中),要用AO做两件事: 1. 创建网络数据集(使用Geodatabase类库) 2. 执行网络分析(使用NetworkAnalyst类库) 在 ...