- 什么是面向对象?
面向对象的方法主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象(万物皆对象)。
以具体事物作为主题,只关系该事物的发展动向,多个对象相互之间不会发生影响
其本质是以建立模型体现出来的抽象思维过程和面向对象的方法(百度百科)
是一种编程思维,也是一种思考问题的方式
如何建立面向对象的思维呢?
1、先整体,再局部
2、先抽象,再具体
3、能做什么,再怎么做
两个基本概念:
类:类是一种分类,一个类别,一个模板,它描述一类对象的行为和状态,是一组具有相同特性与行为的事物集合
对象:是一个个性的产物,是一个个体的特征,是类的一个实例,有状态和行为
- 面向对象三大特征?
封装、继承、多态(抽象)
封装:私有的属性,公开的方法,有参无参构造函数
封装有:属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装…
封装的好处:模块化、信息隐藏、代码重用、插件化易于调试、具有安全性
封装的缺点:会影响执行效率
继承:
继承发生在父子类关系中,子类继承父类,子类可以拥有父类的所有属性和方法。
子类不能继承父类的私有特性,私有属性私有方法和构造方法。
一个类只能有一个父类,一个父类可以有多个子类。
创建子类对象时,系统会默认调用父类的无参构造,若父类没有无参构造,那么我们需要手动调用父类的有参构造。
多态:
方法的重写重载
类与类的继承
接口与接口的继承
instanceof关键字
示例:
if(homeChicken instanceof Chicken){
//...
}
该语句一般用于判断一个对象是否为某个类的实例,是返回true,否返回false
- Java标识符的命令规则?
- 由字母,数字,下划线和$符号组成
- 不能以数字开头,不能是java关键字
- 严格区分大小写
- 要求见名识意
- 符合驼峰命名法
- 类名要求首字母大写
- Java中的数据类型有哪些?
基本数据类型
整数型
字节型 byte (一个字节) 是java中 最小得储存空间 取值范围 -128---127
短整型 short (2个字节) 取值范围:-32768---- 32767
整型 int (4个字节) 取值范围 -2147483648-- 2147483647
布尔类型
布尔类型 boolean (1个字节) true(真) false(假)
引用数据类型
class类,interface接口,array数组
- float f=3.4;是否正确?3.4f
- short s1 = 1; int s2 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?F T
- Java 有没有 goto?
goto是java语言中的保留字,目前还没有在java中使用
其实goto这个词是C语言中的,goto语句通常与条件语句配合使用,用来实现条件转移,构成循环,跳出循环体等功能。而在结构化程序语言中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。但是在java语言中,goto这个词只是作为了保留字,还没有使用。那是因为java语言讲究简单,方便。
- int 和 Integer 有什么区别?
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
- &(逻辑与)和&&(短路与)的区别?
&:在算术运算时分别计算表达式两边的结果,再作&运算
&&:
短路与运算,先计算左边的表达式,如果结果是false,那么不用计算右边表达式,直接返回false
如果左边的表达式结果为true,再计算右边的表达式,如果右边的表达式为true,结果为true, 否则为false
|与||的原理同上
短路与 或 短路或的计算效率更高,建议使用
- Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?12,-11
- 用最有效率的方法计算 2 乘以 8?2乘以4
2*8 可写为 2 << 3 左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方
- 数组有没有 length()方法?String 有没有 length()方法?数组只有length属性
- 在 Java 中,如何跳出当前的多重嵌套循环?
Break
- 构造器(constructor)是否可被重写(override)?
构造器不能被继承,所以不能重写,但是可以重载
构造器是一个特殊的方法,可以有访问性质的修饰,
但是不能够被abstract,final,native,static, synchronized修饰(xin 快儿 奶ri特)
- 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对,当使用关系运算符“==”比较两个对象时,是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false。
当使用equals()方法比较两个对象时,则是比较两个对象的内容是否相同,而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false。
- 是否可以继承 String 类?
String是一个类,而不是接口,这里说的不能被继承指的是不能extends。
String不能被继承,因为它是final的。
String的完整签名是 public final class String
- 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
1.重载要求在同一个类中,重写要发生在存在继承关系的两个类或多个类中并且要求是非静态非私有的方法(类)
2.重载要求参数的顺序、个数、类型至少有一个不同与返回值类型无关,重写是参数和返回值类型必须相同(方法定义方式)
3.方法的重载与访问修饰符无关,而重写要求子类的访问权限必须大于或等于父类,(访问修饰符)
4.在重载中与异常无关,但是重写要求子类不能抛出比父类更大的异常(异常)
- switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
* switch可作用于char byte short int 以及对应包装类Character Byte Short Integer
* switch不可作用于long double float boolean,包括他们的包装类
* switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
* switch中可以是枚举类型
- char 型变量中能不能存贮一个中文汉字,为什么?
* char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,
* 所以char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在
* unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
* 补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
- 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化
因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。
也就是说,当一个static方法被调用时,可能还没有创建任何实例对象
- String s1 = “xyz”;String s = new String(“xyz”);创建了几个字符串对象?
创建两个对象bai
第一个当成参数传入的"xyz"会在常量池生成一个对象
以后用string s1 = "xyz" 之类的新的变量都会引用常量池的xyz
第二个 new的时候 会在堆(java对象)生成一个对象
所以是生成两个对象
- 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。
抽象类可以实现(implements)接口。
抽象类可继承具体类也可以继承抽象类。
面向对象多态的体现
- 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同。
然而知其然,更要知其所以然,这样才能够让我们更加深刻的去理解。
问题一:为什么类之中只能有一个public的类?
每个编译单元(文件)都只有一个public 类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public 类,编译器就会报错。 并且public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有public类。在PUBLIC类中找程序的入口 main函数 你想想如果很多PUBLIC 类,那程序从何运行!
问题二:public 类的名称为什么要与文件名相等?
首先Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。
- 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
JAVA有一个public byte[] getBytes(Charset charset)函数把字符串按指定编码来得到字节数组。
public String(byte bytes[], Charset charset)函数可以用指定字节数组和编码来构造字符串。可以用这两个函数来实现编码转换
例:
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
- 如何取得年月日、小时分钟秒?
创建java.util.Calendar 日历类实例,调用其get()方法传入不同的参数即可获得参数所对应的值。
Java 8中可以使用 java.time.LocalDateTime来获取
Calendar cal = Calendar.getInstance();
cal.get(Calendar.YEAR)
cal.get(Calendar.MONTH) 0-11
cal.get(Calendar.DATE)
cal.get(Calendar.HOUR_OF_DAY)
cal.get(Calendar.MINUTE)
cal.get(Calendar.SECOND)
// Java 8
LocalDateTime dt = LocalDateTime.now();
dt.getYear()
dt.getMonthValue() 1-12
dt.getDayOfMonth()
dt.getHour()
dt.getMinute()
dt.getSecond()
- 如何取得从 1970 年 1 月 1 日 0 时 0 分 0 秒到现在的毫秒数?
Calendar calendar=Calendar.getInstance();
//方法一: System.out.println(calendar.getTimeInMillis());
//方法二: System.out.println(System.currentTimeMillis());
//方法三: System.out.println(Clock.systemDefaultZone().millis());
- 如何取得某月的最后一天?
public static String getLastDayOfMonth(int year,int month)
{
Calendar cal = Calendar.getInstance();
//设置年份
cal.set(Calendar.YEAR,year);
//设置月份
cal.set(Calendar.MONTH, month-1);
//获取某月最大天数
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay);
//格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastDayOfMonth = sdf.format(cal.getTime());
return lastDayOfMonth;
}
- 如何格式化日期?
SimpleDatetimeFormat sdf = new SimpleDatetimeFormat (“yyyy-MM-dd”);
String date = sdf.format(new Date())
- Java 中的 final 关键字有哪些用法?
(1)修饰类:表示该类不能被继承;
(2)修饰方法:表示方法不能被重写;
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)
- 访问权限修饰符有哪些?它们的访问范围从大到小排怎么排?
public > protected > default > private
public是公共的,被public所修饰的成员可以在任何类中都能被访问到
protected是受保护的,受到该类所在的包所保护。protected所修饰的成员会被位于同 一package中的所有类访问到或者不同的package中的子类都能访问
default(默认,缺省的),也被称为friendly友好的
private是私有的,即只能在当前类中被访问到,它的作用域最小
1 private 只存于本类中
2 default 只存于本类,本包中
3 protected 只存在于本类,本包,不同包的父子类中
4 public 任意位置
- 常用的Java集合有哪些?它们有什么区别?
常用的集合接口有:list, set, map, collection(克雷可神)
- List和set是collection的子接口
- List是有序、有下标、可以放重复数据的,常见的实现类有ArrayList、LinkedList、Vector
- Set是无序、无下标、不可以放重复数据的,常见的实现类有HashSet、TreeSet
- List接口的实现类有哪些?它们的区别是什么?
ArrayList、LinkedList、Vector
- ArrayList基于数组的存储结构,查询效率快,删除和添加数据比较慢,线程不安全
- LinkList基于链式存储结构,查询效率慢,删除和添加效率快,线程不安全
- Vector线程安全的,效率低,已经不建议使用
- String、StringBuffer、StringBuilder的区别?
1.String的长度是固定的,是字符串常量,那么我们在做字符串拼接的时候使用+=直接在后面追加,就会对内存的消耗量较大
2、StringBuffer长度可变的,是线程安全的;效率低,使用append进行字符串拼接
3、 StringBuilder长度可变的,线程不安全的;效率高;使用append进行字符串拼接
- HashMap和HashTable的区别?
- Map接口的实现类有 HashMap,HashTable
- 区别:HashMap 线程不安全的,效率高,允许键对象和值对象为null
HashTable线程安全的,效率低,不允许键对象和值对象为空,否则会报异常
- 接口和抽象类有什么区别?
相同点:
1都可以有抽象方法
2都不能被实例化
3一个类要继承抽象方法就必须重写抽象类中的所有抽象方法,一个类要实现接口也必须重写接口中所有的抽象方法
不同点:
1接口不是类,用interface定义,抽象类是用abstract修饰符来修饰的类
2接口中只能有抽象方法,抽象类中可以有抽象方法和普通方法
3一个类可以实现多个接口,但是只能继承一个抽象类
4接口里面定义的变量都是final来修饰的常量,抽象类就没有这个限制
- final和finally和finalize的区别?
- final修饰的变量是常量;值不能改变,必须赋初始值,不能被重写,不能被继承,不能修饰抽象类和抽象方法,不能修饰构造方法。
- Finally与try catch 连用用来处理异常的。
- Finalize()方法jvm垃圾回收机制。
- 常见的异常有哪些?运行时异常和非运行时异常有什么区别?
(1)运行时异常 :在代码过程中由于逻辑判断出现的错误,这类异常不会影响代码的正常编译
- 非运行时异常:在程序编译过程中就强制要求处理的异常,若不处理,那么将不能编译通过;
- jdk jre jvm三者的区别
JVM :JVM是JavaVirtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,
JRE:JRE是java runtime environment(java运行环境)的缩写。光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。
JDK:JDK是java development kit(java开发工具包)的缩写。每个做java开发的人都会先在机器上装一个JDK
- java运行原理
.java源文件,由javac编译为可执行的.class文件,
然后运行.class文件
- java特点
简单性
面向对象
可移植性(一次编译,到处运行)
健壮性
多线程