1. final

  • 对于基本类型,final 使数值不变;
  • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。

可用来修饰类、类的成员、局部变量:

  • final修饰的类——不可以被继承,但可以继承其他类
  • final修饰的方法——不可以被重写。但若父类中没有final修饰的方法,子类重写后,可加final修饰
    • private 方法隐式地被指定为 final
  • final修饰的变量——成为常量,只可被赋值一次。
    • 变量为:引用类型——变量值为对象的地址,地址值不可更改,但是地址内的对象属性值可以更改
    • 变量为:成员变量——需在创建的时候赋值,否则报错。(当未显式赋值时,多个构造方法内部均需为其赋值)。

2. static

一般用来修饰类中的成员。

被static修饰的成员属于这个类,不属于这个类的某个实例对象,可通过类名直接访问。

多个对象共享一个static成员变量。

实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。)

静态内容优先于对象存在,只能访问静态,不能使用this/super(没有对象,则无this)。

同一个类中,静态成员只能访问静态成员方法/变量。

main()为静态方法,仅仅为程序入口,它不属于任何一个对象,可以定义在任何类中。

2.1 静态变量

又称为类变量,也就是说这个变量属于类的。

静态变量属于类,只要静态变量所在的类被加载,这个静态变量就会被分配空间,在内存中只有一份,所有对象共享这个静态变量。

实例变量属于对象,只有对象被创建之后,实例变量才会被分配空间,才能被使用,它在内存中有多个复制。

使用有二种方式: 一个是类名.静态变量,还有一种是对象.静态变量。

特别注意:Java中不能在方法体中定义静态变量(无论该方法是静态的或是非静态的)。

2.2 静态方法

静态方法在类加载的时候就存在了,它不依赖于任何实例。

静态方法必须有实现,也就是说它不能是抽象方法(abstract) 。

只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。

重要用途:实现单例模式。

单例模式的特点:该类只有一个实例。需要求:

  1. 隐藏类的构造函数(构造函数声明为private);
  2. 提供一个创建对象的方法,通过该类的方法来获取类的对象(将这个方法声明为static)。
public class Singleton {private static Singleton instance = null;private Singleton(){};public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;}
}

2.3 静态常量

public static final 修饰

此变量名全部用大写,多个单词使用下划线连接

public static final COMPANY_NAME="HH"。

引用:类名.COMPANY_NAME;

(接口中的成员变量时静态常量,可用接口名直接访问)

工具类中的方法大多是静态的。

2.4 静态语句块

静态语句块在类初始化时运行一次。

public class A {static {System.out.println("123");} public static void main(String[] args) {A a1 = new A();A a2 = new A();}
}

2.5 静态内部类

只有内部类才能被定义为static。

非静态内部类依赖于外部类的实例,而静态内部类不需要。

静态内部类不能访问外部类的非静态的变量和方法

public class OuterClass {class InnerClass {public  void print(){System.out.println("innerClass");}}static class StaticInnerClass {public  void  print(){System.out.println("staticInnerClass");}}public static void main(String[] args) {//InnerClass innerClass = new InnerClass(); // ERROR:'OuterClass.this' cannot be referenced from a static contextOuterClass outerClass = new OuterClass();InnerClass innerClass = outerClass.new InnerClass();innerClass.print();StaticInnerClass staticInnerClass = new StaticInnerClass();//OuterClass.StaticInnerClass in = new OuterClass.StaticInnerClass();//OKstaticInnerClass.print();}
}

输出:

innerClass
staticInnerClass

2.6 优点:

对对象的共享数据提供单份存储,节省空间

可直接由类名调用,不用在堆内创建对象。

2.7 缺点

访问出现局限性(只可访问静态)。

3. instanceof

用法:boolean b=对象 instanceof  数据类型;

Person p1=new Student();
boolean flag1=p1 instanceof Student;//true
boolean falg2=p1 instanceof Person;//false

instanceof通过返回一个布尔值来指出,这个对象是否是:

  1. 这个特定类或者
  2. 它的子类的一个实例或
  3. 当前接口的实现类

的实例。

注意:如果对象A为null,则返回false。

4. 向上转型

自动

将子类对象赋给一个父类引用(多态)

提高了代码的扩展性

只使用父类共性的内容,无法使用子类特有的功能,要不编译不通过。

5. 向下转型

强制

一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用专为子类引用。

在需使用子类特有功能时

易发生ClassCastException异常,所以转换前需要进行类型判断

if(! a  instanceof Dog){...}

Person p=new Student();

Student stu=(Student) p;

如果是直接创建的父类对象,无法向下转型

6. 初始化

原则:

  1. 静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,非静态对象(变量)可能初始化很多次;
  2. 父类有限域子类进行初始化;
  3. 按照成员变量的定义顺序进行初始化,即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化

初始化执行顺序:

  • 父类静态变量
  • 父类静态代码块
  • 子类静态变量
  • 子类静态代码块
  • 父类非静态变量
  • 父类非静态代码块
  • 父类构造函数
  • 子类非静态变量
  • 子类非静态代码块
  • 子类构造函数

面向对象3(final、static、instanceof、向上/向下转型、初始化次序)相关推荐

  1. 【java基础18:方法覆盖与多态】什么时候使用方法覆盖 toString方法的覆盖 多态的基础语法与作用 向上/向下转型

    目录 方法覆盖Override 多态 方法覆盖Override 方法覆盖初体验,什么样的程序要方法覆盖 /*当前程序存在的问题(设计上的问题)??鸟儿在执行move()方法的时候,最好输出的结果是:& ...

  2. Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型...

    任何类都是object类的子类 用object对象接收数组 object类的向上向下转型 转载于:https://www.cnblogs.com/qingyundian/p/7744351.html

  3. 27对象的向上向下转型

    1.对象的向上转型 也就是把右边的子类当作左边的父类来看. Animal.java package Demo01;public abstract class Animal {public abstra ...

  4. java的向下转型_Java 向上/向下转型浅析

    基于java的继承,向上或者向下转型是一种常见的情景,在thinking in java对这一情况进行了详细说明,见以下例子: class Useful { public void f() {} pu ...

  5. Java阻断继承和向上向下转型

    1.阻断继承 从Java15开始,允许使用sealed修饰符,并通过permits明确写出能够从该class继承的子类名称.这种sealed类主要用于一些框架,防止继承被滥用.sealed类在Java ...

  6. Java学习之向上、下转型

    需要注意的是向上.向下转型之后各个成员变量值的变化 首先来看父类代码 public class Quadrangle {public int rangle=30;public void doit() ...

  7. Java多态与向上向下转型

    多态的必要三要素 1.继承 2.方法重写 3.向上转型 多态的作用 1.增加代码的复用性 2.便于代码的管理与维护 案例引入 代码: //测试类 public class Test {public s ...

  8. Java笔记(一)向上向下转型,枚举,初始化,可变长参数,代理,多态,继承

    写给自己看的笔记,很乱.如果有人感兴趣也可以看看,有问题可以问,我进行补充 这里写目录标题 Java数组传递 for循环 Java引用类型详解 可变长参数 ... 可变参数列表 Java参数类型变化 ...

  9. 对象的向上转型和向下转型

    接上一篇:https://blog.csdn.net/green703338130/article/details/81028819 对象的向上转型 对象的向上转型,就是多态的写法. 格式: 父类名称 ...

最新文章

  1. switch...case结构
  2. redis sorted_set数据类型常用命令及跳表skip_list原理
  3. 如何自己动手写一个搜索引擎?我是一份害羞的教程
  4. win8计算机安全模式,WIN8如何设置按F8进入安全模式
  5. 2019 ICPC Asia Nanchang Regional And and Pair 组合数学
  6. ictclas4j 分词工具包 安装流程
  7. 前端必须掌握的经典布局:“双飞翼布局”
  8. Web Client Software Factory系列(4):数据绑定和ObjectContainerDataSource控件
  9. 今日恐慌与贪婪指数为78 贪婪程度有所上升
  10. ArcIMS9.0 学习
  11. TCP:一个悲伤的故事
  12. 软帝java培训实习日志,在软帝学习的第一个星期的小总结
  13. java app微信支付接口_APP支付微信支付,Java后台开发
  14. 彩色文档转换为黑白色pdf文档
  15. 计算机检测不到ipod,[已解决]如何修复iTunes无法识别iPod
  16. 【HUST】网安|编译原理实验|实验四攻略
  17. Owlet for Mac(3D光线追踪渲染软件) 破解版
  18. matlab新建数据字典及如何导入
  19. win10系统默认壁纸路径
  20. 排查Linux服务器是否被入侵步骤

热门文章

  1. 在linux下玩转usb摄像头
  2. UWP Composition API - GroupListView(一)
  3. python data analysis | python数据预处理(基于scikit-learn模块)
  4. 实例:三层交换机VLAN间路由配置命令
  5. 云监控Agent指南-Linux版
  6. java interface 不能存常量数组?
  7. 安装Typora情况下,Windows右键新建菜单中增加新建md文件
  8. reactjs生命周期回调(钩子)函数:componentDidMount componentWillUnmount
  9. k8s部署hbase 2.2.6(含docker、helm部署方案)
  10. Scala成员属性:使用_给属性赋默认值/私有/val