java基础第九篇之final和内部类等

haizai haizai     2022-12-20     708

关键词:

final关键字:final:最终,终极

 

final:作用:修饰类,变量,方法、成员变量的访问

1.final修饰变量:

    final修饰局部变量:

把这个局部变量 变成一个厂里,这个厂里只能被赋值一次

final修饰成员变量:

要求这个成员变量 在创建对象之前必须初始化

所以final修饰的成员变量 第一直觉赋值 第二构造方法赋值

但是也只能赋值一次

 

2.final修饰的类:(太监类) ,不能被子类继承(String)

    final修饰的方法:(子类不能重写)

 

静态代码块:通常写到成员位置

 *   static 代码

静态成员变量优先于静态代码块执行,优先于构造方法执行,优先于main方法执行

 *

 * 特点1.在同一个类中 静态代码块是优先于构造方法执行,静态代码块优先于main方法

 * 而且只会执行一次,第一次使用到(可能是创建对象,也可能是调用对象的静态成员)这个类就是会执行

 

 在jdk1.7版本中局部内部类访问局部变量必须用final修饰.

因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失

想用这个局部变量,就没有了,如果用final修饰会在类的加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用.

 

但是在jdk1.8取消了这个事情,所以我认为是个bug;

 

Student s = new Student()

 

做了哪些事情

1.Student.class加载进内存.

2.声明一个Student类型引用.

3.在堆内存创建对象.

4.给对象中属性默认初始化值

5.属性进行显示初始化

6.构造方法进栈,对对象中的属性赋值,构造方法弹栈

7.将对象的地址值赋值给s

 

 

class Fu

static

syso("A");

 

syso("B")

 

public Fu()

syso("C")

 

 

class Zi extends Fu

static

syso("AA");

 

syso("BB")

 

public Zu()

syso("CC")

 

class Test

main

Zi z = new Zi();

 

1.Jvm调用了main方法,main进栈

2.遇到Zi z = new Zi();会将Fu.class和zi.class分别加载进内存,再创建对象,当Fu.class加载进内存

父类的静态代码块会随着u.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载

第一输出父类静态,第二输出子类静态

3.走Zi类的构造方法,因为java中分层初始化,先初始化父类,在初始化子类,所有先走父类构造,但是在执行

父类构造时,发现父类有构造代码块,构造代码块就优先于构造方法执行,所以abstract不能和private,

第三个输出构造代码块Fu,第四个构造方法Fu

4.Fu类初始化结束,子类进行初始化,第五个输出构造代码块zI,构造方法Zi

 

 

1.包:就是文件夹,管理.java文件的,管理.class文件。

 

2.包:以"."分割每一个单纯,每一个单纯代表一个文件夹

实际开发中:包的写法一般是公司的域名倒过来写

 

3.全限定类名: 包名.类名

    例如:cn.baidu.demo03.PackageDemo

 

4.导包的关键字 import

4.1先导包 import java.util.Scanner;

4.2Scanner sc = new Scanner(System.in);

 

在java中有四种权限修饰符:

 

权限从大到小 以此为:

    public(公共的) protected(受保护的) default(默认的) private(私有的)

 

1.public修饰 在哪里都可以用(在本包中或者在其他包中都可以用)

2.private修饰 只能在本包中的本类中可以使用

 

protected(受保护的) default(默认的)

 

共同点:这两个修饰的成员只能在本包中使用

不同点:protected修饰的成员的,不同包的子类中也可以使用

 

内部类:

    在第一个类的内部 再定义第二个类,那么第二个类称为内部类 第一个类称为外部类

 

根据内部类定义的位置不同

那么可以分成:

 

局部内部类:定义类在方法的里面,开发从来不用.

成员内部类:定义类的外部类的成员位置

创建成员内部类对象的格式:

外部类名.内部类名 变量名 = new 外部类().new 内部类();

 

成员内部类的作用:

成员内部类可以无条件访问外部类的任何成员.

 

匿名内部类: 一种语法格式,用来快速创建抽象类的子类或者接口的实现类对象

 *

 * 1.创建一个抽象类

 * 2.用一个子类继承抽象类

 * 3.创建子类的对象

 

  //dd.eat();

//匿名内部类的第一种写法

new Animal()

@Override

public void eat()

// TODO Auto-generated method stub

System.out.println("未知的动物在吃shi");

;

//匿名内部类的第二种格式

Animal an = new Animal()

@Override

public void eat()

System.out.println("未知的动物在吃shi");

;

//匿名内部类的第三种格式

new Animal()

@Override

public void eat()

System.out.println("未知的动物在吃粑粑");

.eat();

//用匿名内部类创建接口的实现类对象

NYInterface nvyou = new NYInterface()

 

@Override

public void cook()

// TODO Auto-generated method stub

System.out.println("未知的女友在给你做饭");

 

 

;

 

nvyou.cook();

 

1.类可以作为方法的参数和返回值,我们需要是这个类的对象

 *

 * 2.抽象类也可以作为方法的参数和返回值,我们需要的抽象类子类的对象

 *

 * 3.接口也可以作为方法的参数和返回值,我们需要的接口的实现类对象

 

 2. static 方法与普通方法有什么区别?

static 方法在内存中只有一份,普通方法在每个被调用中维持一份拷贝,

static方法属于类方法随着类的加载而加载!普通方法属于对象随着对象

的创建而存在随着对象的消失而消失。

 

3.是否可以在static环境中访问非static变量?

答:static变量在java中是属于类的,它在所有实例中的值都是一样的。

当java虚拟机载入的时候会对static变量进行初始化。如果你的代码尝

试不用实例来访问非static的变量,编译器会报错,因为这些变量还没

有被创建出来,还没有和任何实例关联上。

 

4.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

请说出作用域public,private,protected,以及不写时的区别?

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示空的(default)。

作用域 当前类同一package子孙类其他package

public √ √ √ √

protected √ √ √ ×

default√ √ × ×

private √ × × ×

 

创建内部类的时候先创建了外部类对象然后才创建内部类对象

 

抽象类要让子类继承并重写抽象方法,使用private修饰便不能被继承和重写,使用final修饰也不能被重写,

使用static修饰,可以类名直接调用方法,但抽象方法没有主体调用无意义,所以abstract不能和private,

final,static共用

 

修饰类只能使用public、final、abstract关键字,A、B错;

(2)abstract不能与private、static、final共用,C、D错;

(3)接口中只有常量和抽象方法,常量修饰符为public static  final,F错。

本题主要考查对不同修饰符的理解以及它们之间互相组合来使用的注意事项。

 

 

abstract不能和那些关键字共存:

 

1:private:因为一个abstract方法需要被重写,所以不能修饰为private;

 

2:final:因为一个abstract方法需要被重写.被final修饰的方法不能被重写的,所以不能同final共存;

 

3:static:因为一个abstract方法没有方法体.静态方法需要对方法体执行内容分配空间,所以不能同static共存;

(abstract是没有实现的,不能产生对象,而是static是属于类的,类本身是已经存在的对象)

 

4:synchronized:是同步的,然而同步需要具体的操作才能同步,但,abstract是只有声明没有实现的(既,使用synchronized关键字的是需要有具体的实现

同步的操作的,但是使用abstract时只有声明而没有实现的,这样就产生了冲突)

 

5:native:他们本身的定义就是冲突的,native声明的方法时移交本地操作系统实现的,而abstract是移交子类对象实现的,同时修饰的话,导致不知道谁实现声明的方法.

 

为什么构造方法不能被继承?

    可以这样理解构造器,构造器就是用来创造对象诞生的。说的形象的就是,你爸和你妈有一个构造器,才会造成你的出现。你爷和你奶也有个构造器,才会造成你爸的出现

。 要是构造器能继承的话,那你爸和你妈可以没有自己的构造器。那这样你就可以直接从你爷爷和你奶奶的构造器出来了。这不就造成你和你爸,的诞生没有次序了嘛?

ClassCastException:  类型转换错误

#java学习之路——基础阶段二(第九篇)(代码片段)

...狂讲义(第四版)里面的内容。前言:此随笔主要是Java基础中的基础,相信大家对这方面肯定有着自己的理解和认识,具体详解可以参照万能的baidu,有的我就一笔带过,希望在我的学习之路上能够有大牛进行指导,也有更多的... 查看详情

(第九篇)iptables详解

...简单了解,具体可自行百度,此处不必知晓。Linux防火墙基础Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(也称网络层防火墙);Linux防火墙体系基于内核编码实现,具有非常稳... 查看详情

第九篇数据表设计和保存item到json文件

上节说到Pipeline会拦截item,根据设置的优先级,item会依次经过这些Pipeline,所以可以通过Pipeline来保存文件到json、数据库等等。下面是自定义json#存储item到json文件classJsonWithEncodingPipeline(object):def__init__(self):#使用codecs模块来打开... 查看详情

第九篇:进程与线程

一、paramiko模块二、ssh登录过程和上传下载三、进程和线程简绍四、多线程、多线程实例五、守护线程六、线程锁七、递归锁八、信号量九、线程间通信event十、queue消息队列十一、进程Queue数据传递十二、pipe管道通信十三、进程... 查看详情

第九篇swift的基本使用

1.访问权限/*1>internal:内部的1.默认情况下所有的类&属性&方法的访问权限都是internal2.在本模块(项目/包/target)中可以访问2>private:私有的1.只有在本类中可以访问3>open:公开的1.可以跨模块(项目/包/target)都是可以访问4>f... 查看详情

第九篇道

第九篇 道  “道”这个字出现在人们的视野中,已经有很悠久的历史。但是人们对于“道”这个字的理解非常模糊,都是盲目地去猜测,不知道这个字真正的意义是什么。其实,“道”就是轨道,也可以称之为“宇宙... 查看详情

python成长之路第九篇:网络编程(代码片段)

...接字都是基于文件的,这意味着文件系统支持他们的底层基础结构。这是能够 查看详情

linux篇第九篇——基础io(系统文件io+文件描述符+重定向+文件系统+软硬链接)(代码片段)

⭐️这篇博客就要开始聊一聊Linux中基础IO相关知识,IO相信大家都不陌生,我们在C/C++中对文件进行读写的操作,也就是文件IO,这篇博客我也会带大家回顾一下。这篇博客还会介绍系统中的文件IO调用的接... 查看详情

directx11第九篇光照模型——高光

      本系列文章主要翻译和参考自《Real-Time3DRenderingwithDirectXandHLSL》一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正。      这里是书中的代码和资源。      本... 查看详情

深入理解ajax系列第九篇——jquery中的ajax

前面的话  jQuery提供了一些日常开发中需要的快捷操作,例如load、ajax、get和post等,使用jQuery开发ajax将变得极其简单。这样开发人员就可以将程序开发集中在业务和用户体验上,而不需要理会那么繁琐的XMLHTTPRequest对象。jQuery... 查看详情

flask第九篇flask-script组件

FlaskScript扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Pythonshell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;FlaskScript和Flask本身的工作方式类似... 查看详情

第九篇googlenet——论文翻译

文章目录摘要 查看详情

swift开发第九篇——any和anyobject&typealias和泛型接口

本篇分为两部分:一、Swift中的Any和AnyObject二、Swift中的typealias和泛型接口  一、Swift中的Any和AnyObject  在Swift中,AnyObject可以代表任何class类型的实例,Any可以表示任意类型,包括方法(func)类型,相当于OC中的id。因为id可以... 查看详情

用仿actionscript的语法来编写html5——第九篇,仿urlloader读取文件

第九篇,仿URLLoader读取文件先看看最后的代码functionreadFile(){urlloader=newLURLLoader();urlloader.addEventListener(LEvent.COMPLETE,readFileOk);urlloader.load("../file/test.txt","text");}functionreadFileOk(){mytxt.text 查看详情

学习大数据:java基础篇之封装

1、封装的概念:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。2、好处:(1)只能通过规定的方法访问数据(2)隐藏类的实例细节,方便修改和实现。3... 查看详情

学习大数据:java基础篇之封装

1、封装的概念:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。2、好处:(1)只能通过规定的方法访问数据(2)隐藏类的实例细节,方便修改和实现。3... 查看详情

第九篇:docker镜像仓库(代码片段)

环境说明:操作系统:centos7内核版本:[[email protected]~]#uname-r3.10.0-693.21.1.el7.x86_64摘要:仓库(Repository)是集中存放镜像的地方,与之关联的是注册服务器。那注册服务器和仓库有什么关系呢?比如仓库地址为:https://dl.docker... 查看详情

javascript运动系列第九篇——碰撞运动

×目录[1]碰撞检测[2]无损碰撞[3]有损碰撞前面的话  碰撞可以分为碰壁和互碰两种形式,上篇介绍了碰壁运动,本文将从浅入深地介绍碰撞运动的互碰形式 碰撞检测  对于互碰形式的碰撞运动来说,首先要解决的是... 查看详情