Java 一些常见问题(持续更新)
1. Java 内部类
内部类有四种常见的类型:成员内部类、局部内部类、匿名内部类和静态内部类。
1.成员内部类:定义为另一个类的里面如下:
class Circle {
double radius = 0; public Circle(double radius) {
this.radius = radius;
} class Point{ //内部类
public void DrawPoint() {
System.out.println("DrawPoint");
}
}
}
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。
同时需要注意当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员,如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
2.局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class People{
public People() { }
} class Man{
public Man(){ } public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
3.匿名内部类
大部分匿名内部类用于接口回调。常见于各种监听响应这些的代码当中。如下:
scan_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
4.静态内部类
静态内部类也是定义在另一个类里面的类,但是在类的前面多了一个关键字static。它是不需要不需要依赖于外部类的,它可以因为在没有外部类的对象的情况下,可以创建静态内部类的对象,也因此它不能使用外部类的非static成员变量或者方法。
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
}
} class Outter {
public Outter() { } static class Inner {
public Inner() { }
}
}
5.为什么局部内部类和匿名内部类只能访问局部final变量?
如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值,这样就会出现数据不一致的情况的发生。具体的详解可以看:https://www.cnblogs.com/dolphin0520/p/3811445.html
2. Java的八种基本数据类型
3. Java访问控制符
1.private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在该类的内部。
2.protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。在通常情况下,如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法。
3.public(公共访问权限):这是一个最宽松的访问控制级别,如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类就可以被所有类访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。
4. Java 泛型:
参考:https://www.cnblogs.com/demingblog/p/5495610.html
什么是Java泛型:通俗的讲,泛型就是操作类型的 占位符,即:假设占位符为T,那么此次声明的数据结构操作的数据类型为T类型。
为什么要使用泛型?其实就是为了 类型安全,List<String> 就是用来操作String类型的,你插入Person对象就不行。但是在编译之后会去掉泛型类型。
5. Java 中,直接使用==操作符,比较的是两个字符串的引用地址,并不是比较内容,比较内容请用String.equals()。
6. Java的常量池放在方法区。
7. join方法 wait方法 notify方法:参考https://blog.csdn.net/jisuanji_qiyongjie/article/details/82052970
现假设有一块钟表对象,钟表有两个线程,一个是查询当前时间,另一个是将时间显示出来。需要显示出正确的时间。
由于线程之间的竞争关系,导致很多次显示时间的线程先执行,而获取时间的线程后执行,不能显示正确的时间。这个时候就可以用join,wait,notify 方法。
1.join方法的特点:执行该方法的线程进入阻塞状态,直到调用该方法的线程结束后再继续向下执行
显示时间的线程执行join方法,而获取时间的线程调用join方法,因此显示时间的线程会等待获取时间的线程执行完再执行,从而可以保证每次都可以获得正确的时间。
2.对象锁调用了wait()方法会使当前持有该对象锁的线程处于线程等待状态同时该线程释放对对象锁的控制权,直到在其他线程中该对象锁调用notify()方法或notifyAll()方法时等待此对象锁的线程才会被唤醒。需要注意wait方法是一个本地方法,其底层是通过一个叫做监视器锁的对象来完成的。所以在调用wait方式时要获取到monitor对象的所有权,那如何获取monitor对象所有权?Java中只能通过Synchronized关键字来完成。
8. Java类初始化的顺序:
1.非继承关系中的初始化顺序:static静态代码块和静态成员 -> 普通成员 -> 构造函数执行
2.继承的子类:父类静态代码块和静态成员 -> 子类静态代码块和静态成员 ->父类普通成员和非static块 -> 父类构造函数 -> 子类普通成员和非static块 -> 子类构造函数 。
9. 抽象类和接口:
抽象类是用来捕捉子类的通用特性的 。它不能被实例化。抽象方法可以继承一个类和实现多个接口。子类使用extends关键字来继承抽象类。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。且接口方法默认修饰符是public。你不可以使用其它修饰符。接口只可以继承一个或多个其它接口。子类使用关键字implements来实现接口。
10. Java的final 关键字:
1.修饰类当用final去修饰一个类的时候,表示这个类不能被继承。注意:a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl。b. final类中的成员方法都会被隐式的指定为final方法。
2.被final修饰的方法不能被重写:a. 一个类的private方法会隐式的被指定为final方法。b. 如果父类中有final修饰的方法,那么子类不能去重写。
3.修饰成员变量,必须要赋初始值,而且是只能初始化一次。
Java 一些常见问题(持续更新)的更多相关文章
- Java名词术语---持续更新
在看技术文档的过程中,经常会出现新的java缩写术语,很多时候都不知道它们是什么,在这里记下,持续更新. ——————————————————————————————————————————————— ...
- 2019春招面试高频题(Java版),持续更新(答案来自互联网)
第一模块--并发与多线程 Java多线程方法: 实现Runnable接口, 继承thread类, 使用线程池 操作系统层面的进程与线程(对JAVA多线程和高并发有了解吗?) 计算机资源=存储资源+计算 ...
- 常见算法合集[java源码+持续更新中...]
一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...
- Java基础——集合(持续更新中)
集合框架 Java.util.Collection Collection接口中的共性功能 1,添加 booblean add(Object obj); 往该集合中添加元素,一次添加一个 boolea ...
- Java基础——多线程(持续更新中)
如何建立一个执行路径呢? 通过查询API文档 java.lang.Thread类 该类的描述中有创建线程的两种方式 1.继承Thread类 (1).将类声明为 Thread 的子类 (2).该子类应重 ...
- 易错java知识点总结(持续更新)
1. 2.java转义字符的理解 参考知乎大神:http://www.zhihu.com/question/29232624 正向和逆向处理转义字符 正向:把两个字符 \ n 识别为一个转义字符 ne ...
- Java笔记(持续更新中)
Java语言的特点: 面向对象(封装,继承,多态) 平台无关性(JVM运行.class文件) 语言(泛型,Lambda) 类库(集合,并发,网络,IO/NIO) JRE(Java运行环境,JVM,类 ...
- java并发编程[持续更新]
目录 java并发编程 1.常用类介绍 Semaphore 2.名词解释 2.1 线程安全 2.2 可重入锁和不可重入锁 java并发编程 1.常用类介绍 Semaphore Semaphore 类是 ...
- Java学习目录(持续更新中)
- Java笔记(持续更新)
码云地址 https://gitee.com/MarkPolaris/Java_Mark
随机推荐
- CodeForces 687C【DP】
题意: 给你n个数,然后让这些数相加组合,然后在这些组合的数里可以再相加组合搞出给定 k,输出这些组合的数. 思路: DP. //在枚举到第i个coin的时,dp[i][j],i 肯定能被a[i]组合 ...
- 跳马~~~HDU1372
基础BFS,水过就好~手写队列优化~~ #include <iostream> #include <stdio.h> #include <string.h> #in ...
- poj2389 普通的大数乘法
= =.每次这种题目说只有40位 然而要开到100位,心里总是一万匹草泥马在奔腾: #include <iostream> #include <stdio.h> #includ ...
- bzoj 4975: [Lydsy1708月赛]区间翻转【博弈论】
必败状态是倒序排列,也就是正序对为0 然后发现,每次翻转都是有奇数个数对(\( C_{4x+2}^{2} C_{4x+3}^{2} \) 都是奇数),所以每次翻转丢回改变正反数对的奇偶性 又因为偶数为 ...
- Log2Net的架构简介
在开始介绍源码之前,我们有必要了解下整个系统的大致需求,设计架构,观其大略,这样才能从总体上把握为何细节上要如此设计,不至于在代码的海洋中迷失,时不时吐槽为何要这么多代码.高屋建瓴地把控系统的全局,孜 ...
- jQuery笔记之位置图形
位置图形: 位置坐标图形大小相关方法: .offset() .position() .scrollTop()..scrollLeft() .width().height() .innerWidth() ...
- java实现数据结构
数据结构与算法 :一.数据结构和算法简介 数据结构是指数据在计算机存储空间中的安排方式,而算法时值软件程序用来操作这些结构中的数据的过程.二. 数据结构和算法的重要性 几乎所有的程序都会使用到数据结构 ...
- 145 Binary Tree Postorder Traversal 二叉树的后序遍历
给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3], 1 \ 2 / 3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...
- P2345 奶牛集会andP2657 低头一族
做法是一样的 题目背景 MooFest, Open 题目描述 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时 ...
- P2614 计算器弹琴
题目描述 总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文.(参看洛谷P2549) 小A发现了一个计算器的另一个隐藏功能——弹琴. http://www.bilibili.com/vide ...