java基础知识整理
Posted silence-fire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础知识整理相关的知识,希望对你有一定的参考价值。
1.面向对象的特征:抽象、继承、封装、多态(形象记忆:抽积分多--想想10086)
1.1抽象
忽略一个主题中与当前目标无关的东西,专注的注意与当前目标有关的方面.(就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口)。抽象包括两个方面:数据抽象、过程抽象。
-
- 数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)
- 过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)
1.2继承
一个类可以从现有的类中派生,这个过程称为类继承;新类继承了原始类的特性,新类称为原始类的派生类(子类),原始类称为新类的基类(父类)。子类可以从父类中继承方法和变量,这里注意,不会继承父类的构造器!子类可以新增自己的方法与变量,同时拥有父类的方法与属性;而且子类可以重写父类的方法;
1.3封装
就是把类中具体的方法和属性封装起来,用private私有化,通过类似于get/set的方法访问方法或者变量,最常见的就是javabean;
1.4多态
多态是指允许不同类的对象对同一消息做出响应.多态性包括参数化多态性(重载)和包含多态性(重写,继承,接口实现);方法的重写,重载与动态链接构成多态性。java引入多态的概念原因之一就是弥补类的单继承带来的功能不足;
-
- 动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接
- 重载与重写 --->比较直白的理解方式就是:重载是发生在同一个类中,同一个类的,同名的不同参数和返回值类型的构造器/方法;重写是发生在不同类中,有同一个方法,同一类返回值,不同的方法实现;
2.作用域public,private,protected,以及不写时的区别
3.String 是最基本的数据类型吗?String中常用的方法有什么?String是否可以被继承?Stirng与Stringbuilder,StringBuffer的区别?
- 不是,基础数据类型只包含:整型(byte,short,int,long);浮点型(float,double);char型(char);boolean型(char);谐音:征服菜逼(成为大神的必然结果)
包含的字节(一个字节包含8位,一位就是一个二进制位)分别是:
byte-1;short-2;int-4;long-8;(很好记忆:笨死了,分别是1*2*2*2)
float-4;double-8;
char-2~4(这根编码方式有关,因为语言太多的缘故);
boolean-一般理论上占1字节,但是在java虚拟机中由于都用int类型代替,所以实际上是占了4字节;
- String常用方法:String比较常用的包括两方面:构造方法,方法;
- 构造方法:
- String(String value)
- String(char chars[], int startIndex, int numChars)
- String(StringBuilder builder)
- String(StringBuffer buffer)
- 常用方法
- length()//返回该字符串的长度
- equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写
- charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1
- substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回
- concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于“+”
- indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1
- toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串,对应的有大写方法:toUpperCase()
- replace(char oldChar, char newChar)//用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串
- trim()//截去字符串两端的空格,但对于中间的空格不处理
- contains(String str)//判断参数s是否被包含在字符串中,并返回一个布尔类型的值
- split(String str)//将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回
- 将string转化为各种基本类型的方法:各种基本类型封装类的[parseXXX]方法
- 将各种基本类型转化为stirng方法:String类中的各种[valueOf]方法
- 构造方法:
- String是final方法,不能被继承,但是,不属于Stirng本身的方法(比如从父类继承的)是可以被重写的,比如toString();这个平时比较有用
- 在执行速度方面:StringBuilder>StringBuffer>String
- String为字符串常亮,StringBuilder和StringBuffer是字符串变量,后两者是变量支持对同一个对象进行修改,StringBuilder支持单线程(也就是线程不安全),StringBuffer支持多线程(线程安全);
4.基本类型与其对应的封装类有什么区别和联系:(了解思路:是什么,为什么,有什么注意点)
- 基本类型,是数据的基本属性,而对应的封装类,则是一个类,在使用的时候直接使用其对象;基本数据类型只能按值传递,而封装类按引用传递;
- 封装类的出现,是为了更方便的使用一些基本类型不具备的方法,让我们能够用面向对象的方式进行编程
- JDK5.0开始可以自动封包了 ,也就是基本数据可以自动封装成封装类,基本数据类型的好处就是速度快(不涉及到对象的构造和回收),封装类的目的主要是更好的处理数据之间的转换,方法很多,用起来也方便;
5.&和&&的区别?
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与,&&具有短路特性
6.heap 和stack 有什么区别?[属于JVM内容]
java中的堆(heap)和栈(stack),是一种内存的存储机制,分别是堆内存和栈内存,在程序中定义的基本类型变量和对象的引用变量,都是存储在stack内存中的,当执行超过变量的作用域之后,会自动释放这个变量对应的内存空间,另做他用;heap内存主要存储new出来的对象和数组,它们占用的内存不会被自动释放,只有没有引用变量指向它的时候,才变为垃圾,在随后的一定时间短被gc(垃圾回收器)回收;
通俗点说:就是steap中存放的是java中的指针,可以指向heap中的实际存储的数据;
7.Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
该方法返回与参数最接近的整数,Math.round(11.5)==12 Math.round(-11.5)==-11
8.数组有没有length()这个方法? String 有没有length()这个方法?
这是个陷阱,数组是一种数据结构,而不是一个类,而String是一个类,所以有方法length(),数组这种数据结构有的只是length属性;
9.在JAVA 中,如何跳出当前的多重嵌套循环?
可以使用break;这里注意普通的break只能跳出一层循环,而使用标号就可以跳出多重循环;使用return直接连下面所有的程序都不执行了,这点要注意!
10.构造器是否能被override,能够被overload,能够被继承?override与overload的区别?
- 构造器Constructor 不能被继承,因此不能重写Overrid,但可以被重载Overload
- 前面“多态”里讲了的;同一个类与不同的类的区别;
11.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?[hashcode的存储机制]
不对,有相同的hash code
结论(没太明白,先记着):
- 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等
- 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等
12.以下二条语句返回值为true 的有:
A:“beijing”==“beijing”;
B:“beijing”.equalsIgnoreCase(new String(“beijing”));
结论:A和B,A中两个Beijing是没有new出来的,所以指向的堆地址相同,但是后面B的new的指向不同的堆地址;==对比的是物理地址;equals对比的是值得大小;
13.我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
1 public String translate(String str){ 2 String tempStr = ""; 3 try{ 4 tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); 5 tempStr = tempStr.trim(); 6 }catch (Exception e){ 7 System.err.println(e.getMessage()); 8 } 9 return tempStr; 10 }
14.abstract class 和interface 有什么区别?接口中是否可以定义静态方法?
先了解抽象方法:它只有声明,而没有具体的实现,也就是方法体。例如:public void fun();
抽象类(abstract class):
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
- 抽象类不能用来创建对象;
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类;
抽象类和普通的类并没有区别;
接口(interface):
接口中可以有变量和方法,其中的变量会被隐式地指定为public static final变量,方法会被隐式地指定为public abstract方法且只能是public abstract方法;且所有的方法不能有具体的实现;如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。但是对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法();
两者区别:
- 抽象类可以有自己的实现方法,但是接口只能有public abstract方法;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口;
- 设计层次上:
- 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象;
- 对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动;
接口中不能定义静态方法:一个类要实现接口中的方法,其实就是对接口方法的重写。而要实现静态方法,就必须重写接口中的静态方法;如果可以定义抽象静态方法static,设 static abstract method(); 是抽象类A的方法,那么因为是静态方法那可以用A.method(); 而这个方法又是抽象的没有方法体,掉用了怎么执行呢?
15.java问什么不允许在静态方法中访问非静态方法或变量?
静态方法是属于类的,而普通方法是属于对象的。属于类的静态方法可以在对象不存在的时候就能访问到,而普通方法必须先new一个对象才能用这个对象访问。当我们访问调用静态方法的时候(使用类名.静态方法名)这个时候就没有对象创建,所以普通方法是访问不到的。为了避免这种错误,所以java就不允许在静态方法中访问非静态方法。
16.Static inner class(静态嵌套类)与Inner Class(内部类)有什么区别?
使用方式:
1 static class Outer { 2 class Inner {} 3 static class StaticInner {} 4 } 5 6 Outer outer = new Outer(); 7 Outer.Inner inner = outer.new Inner(); 8 Outer.StaticInner inner0 = new Outer.StaticInner();
静态内部类的作用:只是为了降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖与外在的类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用;
非静态内部类的不同之处:可以自由使用外部类的所有变量和方法;
17.静态变量和实例变量的区别?
静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它
18.写clone()方法时,通常都有一行代码,是什么?
clone的用途与含义:https://blog.csdn.net/u011514810/article/details/52345113
clone的实际使用:http://www.cnblogs.com/o-andy-o/archive/2012/04/06/2434904.html
19.GC 是什么? 为什么要有GC?GC会有内存泄漏吗?
GC:垃圾回收器,用于内存的管理,准确的说是用来管理heap内存的,Java 中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”,如果没有索引指向相应对象的内存区域,GC会在固定时间进行内存回收,但是stack内存的却是根据代码中变量是否超过了变量的作用域而被java回收。扩展:前面的stack内存和heap内存的区别;在扩展:研究JVM机制;
GC会发生内存泄漏,当存在没有用却又有索引指向他的时候就无法回收相应内存;
20.String s=new String(“xyz”);创建了几个String Object?
两个对象,一个是"xyx",一个是指向"xyx"的引用对象s;
20.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数
21.说出一些常用的类,包,接口,请各举5 个;
22.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)?
可以继承其他类或实现其他接口
23.在java 中一个类被声明为final 类型,表示了什么意思?
表示该类不能被继承,是顶级类
以上是关于java基础知识整理的主要内容,如果未能解决你的问题,请参考以下文章