Java 基础

Java 基础

内存解析

stack中存储局部变量,heap中存储对象,data segment中存储静态变量,code segment中存储方法

访问控制

修饰符类内部同一个包子类任何地方
privateyes
defaultyesyes
protectedyesyesyes
publicyesyesyesyes

对于class的权限修饰只能使用public和default

继承中的构造方法

  • 子类的构造方法必须调用基类的构造方法
  • 子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法
    1. 使用this(argument_list)调用本类的另外的构造方法
    2. 调用super必须写在子类构造方法的第一行
  • 子类的构造方法没有显示调用基类构造方法,系统默认调用基类无参数的构造方法
  • 基类中无无参的构造方法且子类没有显式调用基类的构造方法,即编译错误

Object类的toString()

return 类名+hashcode

Object类的equals()

判断两个对象是否指向相同对象相当于x==y

对象转型

可以使用 变量 instanceof 类名 来判断引用型变量所“指向”对象是否属于该类或该类的子类

一个基类引用类型变量可以指向其子类的对象,但是一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)

多态的条件

  1. 要有继承
  2. 要有重写
  3. 父类引用指向子类对象

C++和java多态的区别

java中的类对象在构造前(调用构造函数之前)就已经存在了,其函数表和对象类型也已经确定了,就是说还没有出生就已经存在了。而C++中只有在构造完毕后(所有的构造函数都被成功调用)才存在,其函数表和对象的实际类型才会确定。

例1:C++:

class Base   
{   
public:   
Base()   
{   
init();   
}   
virtual ~Base() {}   
public:   
virtual void do_init()   
{   
init();   
}   
protected:   
virtual void init()   
{   
cout << "in Base::init()" << endl;   
}   
};   
class Derived : public Base   
{   
public:   
Derived()   
{   
init();   
}   
protected:   
void init()   
{   
cout << "in Derived::init()" << endl;   
}   
};   
int main(int argc, char* argv[])   
{   
Base* pb;   
pb = new Derived();   
delete pb;   
return 0;   
}    

例2:java

class Base   
{   
public Base()   
{   
init();   
}   
protected void init()   
{   
System.out.println("in Base::init()");   
}   
public void do_init()   
{   
init();  
 }  
 }   
class Derived extends Base   
{   
public Derived()   
{   
init();   
}   
protected void init()   
{   
System.out.println("in Derived::init()");  
}   
}   
public class Test   
{   
public static void main(String[] args)   
{   
Base base = new Derived();   
}   
} 

例1的执行结果是:

in Base::init()   in Derived::init()    

例2的执行结果是:

in Derived::init()   in Derived::init()  

C++中,如果函数不是虚函数,则调用某个函数,是根据当前指针类型来判断的,并不是根据指针所指向对象的类型。

Java中,如果函数不是抽象函数,而是一个普通函数,它是默认实现类似C++中虚函数功能的,也就是说,调用某个函数,是根据当前指针所指向对象的类型来判断的,而不是根据指针类型判断。正好与C++中的普通函数相反。即:JAVA里自动实现了虚函数。

抽象类

  • 对于一个父类,如果父类的某个方法在实际中无意义,需要根据子类实现特定的需求,那么可以将这个方法声明为abstract方法,此时该类也就成为abstract类了
  • 如果一个类不含有抽象方法也可以声明为抽象类
  • 抽象类也可以拥有成员变量和普通的成员方法
抽象类和普通类的主要区别
  1. 抽象方法不能为private(因为如果为私有就无法被子类继承,子类就无法实现该方法)
  2. 抽象类不能用来创建对象
  3. 继承抽象类的子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类

Final 关键字

  • final的变量的值不能被改变
    1. final的成员变量
    2. final的局部变量(形参)
  • final的方法不能被重写
  • final的类不能被继承

接口

接口是抽象方法和常量值的定义的集合

  • 接口可以多重实现
  • 接口中声明的属性默认为public static final的,也只能是public static final
  • 接口中只能定义抽象方法,这些方法默认为public,也只能为public
  • 接口可以继承其他的接口,并添加新的属性和抽象方法

异常的分类

Error 和 Exception 继承于Throwable类

  • Error是无法处理的
  • Exception是可以被捕获的,也是需要捕获的

RuntimeException继承于Exception,这是属于运行时出现的问题,这不是对应函数的问题,这类异常是无需进行捕获的

异常的捕获和处理

try代码段后跟有一个或多个catch代码段,每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法,声明的异常从上到下范围逐渐增大

异常发生时,程序会终止当前的流程。

finally段的代码无论是否发生异常都有执行

getMessage()方法,用来得到有关异常事件的信息

printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容

声明并抛出异常

重写方法需要抛出与原方法所抛出异常类型一致异常或不抛出异常

parseInt()和valueOf()的区别

Integer.parseInt()就是把String类型转化为int类型

Integer.valueOf()就是把String类型转化成Integer类型

String.valueOf(int)就是返回int参数的字符串形式

toString()可以把一个引用类型转化为String类型,如:

Integer a=new Integer(123);

String b=a.toString();

容器Api

Collection 接口定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式

  • Set 中的数据对象没有顺序且不可以重复
  • List中的数据对象有顺序而且可重复

上述重复的定义是保证值一样,保证同一类的equals是能相等的

Map接口定义了存储键值对的方法,键值不能重复

Iterator接口

Iterator对象称为迭代器,用以方便的实现对容器内元素的遍历操作

boolean hasNext();

Object next(); //返回游标右边的元素并将游标移动到下一个位置

void remove(); //删除游标右面的元素,在执行完next之后该操作只能执行一次

Collections接口

该接口提供了一些静态方法实现了基于list容器的一些常用算法。

void sort(List)

void shuffle(List) 对List容器内的对象进行随机排列

void reverse(List) 对List容器内的对象进行逆序排列

void fill(List,Object) 用一个特定的对象重写整个List

void copy(List dest,List src) 将src List容器拷贝到dest List 容器

int binarySearch(List, Object) 对于顺序的List容器,采用折半查找的方法查找特定对象

Comparable接口

comparable 接口中只有一个方法

public int compareTo(Object obj){

返回0表示this==obj

返回正数表示this>obj

返回负数表示this

输入/输出流的分类

数据流方向不同分为输入流和输出流

处理数据单位不同分为字节流和字符流

字节流字符流
输入流InputStream
输出流OutputStream

功能不同分为节点流和处理流

节点流类型主要有FileInputStream,FileOutputStream,FileReader,FileWriter

处理流中含

  • 缓冲流

BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter

BufferedReader提供readLine方法用于读取一行字符串 //阻塞

BufferedWriter提供newLine用于写入一个行分隔符

  • 转换流

OutputStreamWriter,InputStreamReader

  • 数据流

DataInputStream(InputStream)

DataOutputStream(outputStream)

结合ByteArraysInputStream和ByteArraysOutputStream

  • Print流

out是printStream类型的

PrintWriter和PrintStream输出操作不会抛异常,有自动flush功能

  • Object流

想要把某个类序列化需要实现Serializable接口,jdk帮你控制序列化过程

transient修饰的成员变量在序列化时默认不写

eternalizable接口是可以自己控制序列化过程,继承于Serializable接口

多线程

线程是一个程序内部的顺序控制流

每个进程都有独立的代码和数据空间,进程间切换有较大的开销

线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程切换开销小

创建线程的两种方式:

  • 第一种

实现Runnable接口

Thread myThread=new Thread(target)//target为Runnable接口类型

只有一个run()方法

  • 第二种

可以定义一个Thread的子类并重写其run方法

class MyThread extends Thread{

​ public void run(){…..}

}

然后生成该类对象

尽量使用第一种用接口

方法功能
isAlive()判断线程是否还活着,即线程是否还未终止
getPriority()获得线程优先级
setPriority()设置优先级
Thread.sleep()静态方法当前线程睡眠指定毫秒数
join()调用某线程的该方法,将当前线程与该线程合并,即等待该线程结束再恢复当前线程的运行
yield()让出CPU,当前线程进入就绪队列
wait()当前线程进入对象的wait pool
notify()/notifyAll()唤醒对象的wait pool中的一个/所有等待线程

使用sychronized关键字对函数进行锁定,锁定当前对象,只有对应代码执行完了,别的进程才能进入

wait与sleep的区别

wait时别的线程可以访问锁定对象

sleep时别的线程也不可以访问锁定对象

网络编程

java.net包中有Socket和ServerSocket,分别用来实现client端和server端

建立连接所需寻址信息为计算机的IP地址和端口号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值