Java基础学习笔记整理

阅读: 评论:0

2024年2月8日发(作者:)

Java基础学习笔记整理

Java学习笔记整理——李兴华视频归纳

Java学习笔记之一

一、环境变量设置

1、JDK下载链接地址:

/technetwork/java/javase/downloads/

下载完毕后,进行安装,比如安装到C:Program FilesJavajdk1.6.0_12目录下,安装完毕后设置环境变量,需要设置的项如下:

(1) JAVA_HOME: C:Program FilesJavajdk1.6.0_12

(2) PATH:C:Program FilesJavajdk1.6.0_12bin

(3) CLASSPATH: .;%JAVA_HOME%;%JAVA_HOME%;

//注意:点号、分号一定不能丢掉了。

2、开发工具IDE下载地址:

(1)Eclipse:/downloads/

(2)Netbeans: /

(3)Jcreator:/

3、开发工具IDE-Eclipse常用快捷键:

/blog/1290525

二、Java基本介绍

1、Java历史特点:

Java自1995年诞生,至今有16年的历史,从诞生之日起,逐渐被广泛接受并成为推动了web迅速发展。Java的三种核心机制为虚拟机机制、代码安全机制、垃圾回收机制。

Java最大的特点是平台无关性(可移植性好),通过不同的虚拟机与各类操作系统无缝结合。虚拟机实例是指:执行一个应用程序的时候,虚拟机产生一个实例对象来支撑应用程序的运行。

2、类和对象:

类是对现实世界某一类事物的抽象和提取,比如现实世界中有许多各式各样的人,同时每一个具体的个体的名字、性别、身高都是差异化的,更进一步地将这些实例对象抽象成具有某些特征的一类事物,这就是类。类中包括属性、方法等。

3、面向对象语言的三大特征:

封装、继承、多态是面向对象语言的三大特征。

封装:将类的成员变量、构造方法或者成员方法私有化private,不直接暴露给外部使用者,而是通过提供一些接口供外部调用。

继承:子类一方面通过继承父类的非私有化的成员变量、成员方法来实现自己,并能够在此基础上进一步拓展一把自己。

多态:多态涉及到的是一个类型向上转型和向下转型的问题,通过父类搞出许多子类对象,每个子类对象都有自己的特点。

三、代码实战操作

1、 编写最简单的helloworld程序并运行查看效果。

2、 程序的注释方法、类名、变量名、方法名命名规则学习等。

3、 Java语言的基本数据类型(四类八种)引用数据类型:数组、接口、类。

4、 Java语言的表达式、运算符、判断和循环语句等。

5、 数组的定义、使用,方法的声明和使用演练等操作。

四、面向对象语言基础部分

面向对象语言的三大特征是:封装、继承、多态

下面先介绍封装和继承,然后再介绍多态性。

Java学习笔记整理——李兴华视频归纳

父类:人类Person

子类:学生类Student

子类向父类转型为向上转型,父类向子类转型为向下转型也叫做强制转换。

代码如下:

/**

* @author Administrator

*

* @description 父类,基类

* @history

*/

class Person{

}

/**

* @author Administrator

*

private String name; // private进行封装操作

private int age;

// 覆写toString方法

@Override

public String toString() {

}

public Person(String name,int age){ // 全参数构造方法

= name;

}

public Person(){ // 无参数构造方法

//do nothing

}

// getter/setter方法

public String getName() {

}

public void setName(String name) {

}

public int getAge() {

}

public void setAge(int age) {

}

= age;

return age;

= name;

return name;

= age;

return "Person[name=" + name + ",age=" + age + "]";

Java学习笔记整理——李兴华视频归纳

* @description 子类,继承自父类person

* @history

*/

class Student extends Person{

}

public class MyDemoTest{

/**

*@description

*@param args

*/

public static void main(String[] args){

}

// 定义并实例化父类对象

Person p = new Person("java",16);

n(p); // 调用toString方法

// 定义并实例化子类对象

Student s = new Student("java",16,"sun");

n(s); // 调用toString方法

Person p1 = new Student("eclipse",12,"ibm"); // 实例化子类对象赋给父类对象

Student s1 = (Student)p1; // 父类向子类转换,强制类型转换-向下转型

n(s1);

private String school; // 子类拓展的属性,学校

// 覆写toString方法

@Override

public String toString() {

}

public Student(String name,int age,String school){

}

public Student(String name){

}

// getter/setter方法

public String getSchool() {

}

public void setSchool(String school) {

}

= school;

return school;

super(); // 调用父类无参数构造方法

= name;

super(name,age); // 调用父类带两个参数的构造方法

= school;

return "Student[name =" + e() + ",age = " + ()

+ ",school=" + school + "]";

Java学习笔记整理——李兴华视频归纳

}

/**

* @author Administrator

*

* @description

* @history

*/

public class MyFirstDemo {

// 类名、方法名、变量名等命名规则

// 一律做到简单明了,容易明白——简单就是美

// 1、类名首字母采用大写形式,如果是多个单词拼接采用驼峰形式

// 2、方法变量名首字母采用小写形式,方法名一般是动+名,变量命名做到见名知意

/**

*@description main方法程序的入口

*@param args 参数

*/

public static void main(String[] args) {

n("hello world"); // 最简单的hello world程序

// 基本数据类型——四类八种 // 引用数据类型——接口、数组、类

// byte,short,int,long,float,double,boolean,char

byte b = _VALUE; // 基本数据类型的包装类

short s = _VALUE; // short类型的最大值

int i = _VALUE; // int类型的最小值

long l = _VALUE; // long类型的最大值

float f = 1.50f; // 定义float类型变量需要设置f

double d = 1.50d; //定义double类型变量需要设置d

char c = 'c'; // 定义char类型字符

boolean boo = ; // 定义boolean类型值

// 遵循变量先声明后使用原则

// 类型转换,精度高的向精度低的转换为强制类型转换

byte b1 = 25;

int i1 = b1; // 自动转换,提高精度

int i2 = 350;

byte b2 = (byte)i2; // 强制类型转换,精度丢失

int sum = 0; // 定义变量时候养成初始化变量的习惯

byte s1 = 1;

int s2 = 125;

sum = s1 + s2; // byte类型会自动转换成int类型,类型提升

// 设计模式-襄垣模式

Java学习笔记整理——李兴华视频归纳

}

Integer in1 = 125;

Integer in2 = 125; // in1==in2 true

// 注释方式 // /* 注释部分,代码不生效*/ /** 文档注释**/

// 表达式、运算符、判断循环分支语句和C语言类似

// if for while do while break continue switch case以及+ - * % /等等

// 数组的定义、使用以及方法的定义和使用

int[] array = new int[10]; // 定义整型数组并且数组长度为10

for (int j = 0; j < ; j++) {

array[j] = j + 1; // 初始化数组元素

}

int tmp = 0;

while (tmp < ) {

n(array[tmp++]); // 使用输出数组元素

}

sayHelloWorld(); // 调用静态方法sayHelloWorld()

}

// 定义方法private该类内部才能够调用的方法

// static静态方法、方法名称动+名,首字母采用小写

private static void sayHelloWorld() {

}

n("hello world");

Java学习笔记之二

一、面向对象基础部分

1、this、super关键字

基类:BaseTest

public class BaseTest {

}

/**

* @author Administrator

*

* @description this,super关键字测试类

* @history

protected String pwd; // 定义protected属性pwd

public BaseTest(){

}

public String sayHelloWorld(){

}

return "hello world";

// 无参数构造方法

Java学习笔记整理——李兴华视频归纳

*/

public class MyTestDemo extends BaseTest{

// notes:测试使用而已,代码功能模拟而已

private String username; // 定义用户昵称私有属性private修饰

private String password;

public MyTestDemo(String username){ // 构造方法

}

public MyTestDemo(){

// 无参数构造方法

super(); // 调用父类无参数构造方法

}

public void sayHello(){

d(); // this.方法调用当前对象的sayWord方法

loWorld(); // super.方法调用父类sayHelloWorld方法

}

public String sayWord(){

}

// this表示当前对象

public boolean equals(Object obj){

}

/**

*@description

*@param args

*/

public static void main(String[] args) {

// this关键字绑定了当前该对象,通过this.属性、this.方法

// super关键字用在子类要调用父类的属性或者方法中,通过super.属性、super.方法

MyTestDemo obj1 = new MyTestDemo("hello-java"); // 定义并实例化对象

MyTestDemo other = (MyTestDemo)obj; // 传入的比较对象,强制转换操作

// 简单模拟,如果对象的username属性值相同那么就认为相同

if(this == other){

}

if(other instanceof MyTestDemo){

}

return false;

if((me)){

}

return true;

return true;

return "hello this";

this();// this()调用无参数构造方法

me = username; // this.属性访问当前username属性

// super.属性调用父类属性

rd = ;

Java学习笔记整理——李兴华视频归纳

}

}

lo(); // 调用对象的sayHello方法

MyTestDemo obj2 = new MyTestDemo("hello-java");

// equals方法传入的参数类型为object,传入的obj2会自动向上转型处理

boolean result = (obj2);

n(result); // true

2、static、final关键字

/**

* @author Administrator

*

* @description final和static关键字学习

* @history

*/

public class FinalAndStaticTestDemo {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// final关键字主要有三种场景

// 1、final定义的变量为常量,比如基本数据类型的值一旦初始化了不能改变

// 2、final定义的类为终结类,不能再被继承,比如string类型

// 3、final定义的方法为终结方法,不能被覆写,否则编译器会报错

final String str = "helloworld"; // final修饰变为常量不能改变

//str = "hellojava"; // eclipse提示:The final local variable str cannot be

assigned.

// 进一步思考下面两个问题

String s1 = "hello";

String s2 = "hello1";

final String s = s1;

s1 = s2;

n(s); // hello还是hello1呢

// 引用不可变,内容可变是这个意思吗?

StringBuffer sb = new StringBuffer();

("hello");

final String fs = ng();

final StringBuffer fsb = sb;

("world");

n(fs);// hello还是helloworld呢

Java学习笔记整理——李兴华视频归纳

}

}

n(ng()); // hello还是helloworld呢

// static关键字比较类似也有下面三种场景

// static修饰的变量为静态变量,它不同于对象/实例变量,是关联在某个类上的

// static修饰的类为静态类

// static修饰的方法为静态方法,它也不同于对象/实例方法,是关联在某个类上的

// static int i = 100;

// static class HelloWorld{ //... }

// public static void sayHeloWorld(){ //... }

// 静态变量和对象变量

static int i = 100; // 定义静态变量i

int j = 100; // 定义成员变量/实例变量

public static void sayHelloWorld(){ // 定义静态方法sayhelloworld

n("hello world");

}

static class HelloWorld{ // 定义内部类

// ...

}

3、引用传递介绍和应用

/**

* @author Administrator

*

* @description 引用传递的简单学习

* @history

*/

class DemoTest{

String ide = "eclipse"; // 为了方便访问暂不封装

}

public class MyDemoTest{

/**

*@description

*@param args

*/

public static void main(String[] args){

// 对象属性值访问和变更

DemoTest dt1 = new DemoTest();

n(); // eclipse

= "netbeans"; // 改变ide属性值

n(); // netbeans

Java学习笔记整理——李兴华视频归纳

}

function(dt1); // 调用方法function

n(); // jcreator

// String类赋值和变更

String ide = "eclipse";

function(ide);

n(ide); // eclipse而不是netbeans

}

private static void function(String ide) {

ide = "netbeans"; // 赋值为netbeans

}

// 测试方法function

private static void function(DemoTest dt2) {

= "jcreator"; // 改变ide属性值

}

4、静态块、代码块、同步块

/**

* @author Administrator

*

* @description 静态块、代码块、同步块学习测试类

* @history

*/

class BlockDemo {

public BlockDemo() {

}

// 构造方法、构造代码块和静态代码块初始化顺序呢?

n("BlockDemo->BlockDemo");

static {

}

{

}

// 在类中定义的{ //...}为构造代码块

// 构造代码块和对象一起初始化的

n("BlockDemo->{}");

// 在类中定义的static{ //...}为静态代码块

// 静态代码块的程序只会被初始化一次

n("BlockDemo->static");

// 静态块、构造块、构造方法 // 表面初步分析,具体有待研究

}

public class MyDemo {

/**

Java学习笔记整理——李兴华视频归纳

}

* @description

* @param args

*/

public static void main(String[] args) {

}

// 静态块、代码块、同步块

{

// 在方法中用{ //... }定义的为普通代码块

int x = 100;

n(x); // 100 相当于局部变量

}

int x = 200;

n(x); // 200

new BlockDemo();

new BlockDemo();

// BlockDemo->static static代码块只会被初始化一次

// BlockDemo->{}

// BlockDemo->BlockDemo

// BlockDemo->{}

// BlockDemo->BlockDemo

5、构造方法、匿名对象、单例定义以及实现

/**

* @author Administrator

*

* @description 构造方法、匿名对象、单例学习测试类

* @history

*/

public class MyDemoTest {

private String username; // 定义私有属性username

// 构造方法的作用是初始化操作

// 构造方法是一种特殊的方法,构造方法也有重载

public MyDemoTest(){

// 无参数构造方法

}

public MyDemoTest(String username) { // 定义构造方法

me = username; // 对属性初始化赋值操作

}

/**

*@description

*@param args

Java学习笔记整理——李兴华视频归纳

}

*/

public static void main(String[] args) {

}

// 实例化一个匿名对象

// 匿名对象不在栈中开辟空间赋地址值

new MyDemoTest("eclipse");

/**

* @author Administrator

*

* @description 单例学习测试类

* @history

*/

class Singleton {

}

class Singleton2{

private Singleton2(){

}

// 懒汉式获取单例代码

private static Singleton2 instance = null;

private static Object lock = new Object();

// 获取单例方法,效率比较低

// 每次进入都要进行锁判断,而实际情况我们是第一次null比较特殊

/*public static Singleton2 getIntance(){

synchronized (lock) {

}

return instance;

if (instance == null) { // 如果为null进行实例化对象操作

instance = new Singleton2();

}

// 构造方法私有化,外部不能直接调用

n("private Singleton2(){//...}");

private Singleton() {

}

// 饿汉式获取单例代码

private static Singleton instance = new Singleton();

// 对外提供一个getInstance方法获取单例

public static Singleton getIntance() {

}

return instance;

// 将构造方法私有化,外部不能直接调用

n("private Singleton(){//...}");

Java学习笔记整理——李兴华视频归纳

}

}*/

// 上面同步代码的另外一种写法如下,效率比较低

// public static synchronized getInstance(){ //...}

// 对同步代码进行改写

public static Singleton2 getIntance(){

}

if(instance == null){

}

return instance;

synchronized(lock){

}

// 如果换为下面这种形式那么就可能不是产生一个实例对象了

/*synchronized(lock){

instance = new Singleton2();

}*/

if(instance == null){ // 进行双重检验操作

instance = new Singleton2();

}

6、内部类、匿名内部类应用

class Outer{ // 定义外部类

}

/**

* @author Administrator

*

* @description 内部类以及匿名内部类学习测试类

* @history

private String info = "helloworld" ; // 定义外部类属性

private static String info2 = "helloeclipse"; // 定义静态变量

class Inner{ // 定义内部类

public void print(){

}

static class StaticInner{ // 通过static定义的内部类为外部类

public void print(){

}

public void fun(){

new Inner().print() ; // 通过内部类的实例化对象调用方法

}

}

n(info2);

// 内部类的好处之一:直接访问外部类属性

n(info) ; // 直接访问外部类属性

}

Java学习笔记整理——李兴华视频归纳

*/

public class InnerClassDemo{

}

/**

*@description

*@param args

*/

public static void main(String[] args){

}

new Outer().fun() ; // 调用外部类的fun()方法

// 另外一种实例化方式

Outer out = new Outer();

in = Inner();

();

// 通过外部类.内部类实例化内部类对象

//StaticInner sin = new Inner(); //需要导入外部类所在的包

//();

二、面向对象高级部分

1、继承的进一步讨论

class Base{

}

class ZiLei extends Base{

// 定义子类覆写print方法

void print(){

}

/*void print1(){

// Cannot reduce the visibility of the inherited method from Base

}*/

// 覆写override和重载overload区别

// 子类访问父类中的方法,前面super关键字内容

// ();

n("Super->print()");

// 定义基类

void print(){

}

public void print1(){

// 父类方法的访问权限,子类覆写该方法的时候不能降低权限

}

n("Base->print()");

// 覆写是父类子类之间的关系,重载是同一个类之间的关系

}

/**

Java学习笔记整理——李兴华视频归纳

* @author Administrator

*

* @description 继承中的方法覆写

* @history

*/

public class OverrideDemo{

}

public static void main(String args[]){

}

new ZiLei().print(); // 调用的内容是覆写后的方法实现

// 另外java中只能够单继承,不同于C++,但是可以多重继承

/*class A{

}

class B extends A{ //class C extends A,B{ // ...}编译错误

// ...

}

class C extends B{

// ...

}*/

// ...

2、接口和抽象类进一步讨论

/**

* @author Administrator

*

* @description 接口测试类

* @history

*/

interface Interface{

}

class I implements Interface{

}

public class InterfaceTestDemo {

/**

public void print() {

}

public void printInfo() {

}

// ...

// 方法实现

n(INFO); // helloeclipse

public static final String INFO = "helloeclipse";

public void print(); // 定义方法

public abstract void printInfo();

Java学习笔记整理——李兴华视频归纳

}

*@description

*@param args

*/

public static void main(String[] args) {

// 接口interface

// 接口interface和抽象类abstract一样不能直接实例化必须通过子类来实现

new Interface(){

};

// 接口和抽象类对比,接口更像一种规范、抽象类更像一种模板

public void print() {

}

public void printInfo() {

}

// ...

// 匿名内部类,方法实现

n(INFO); // helloeclipse

// 抽象类定义一些公共的实现,以及一些未实现的方法交给子类具体实现特定的功能-模板方法

}

/**

* @author Administrator

*

* @description 抽象类学习测试类

* @history

*/

abstract class Abstract{ // 定义抽象类

public final static String INFO = "helloeclipse"; // 定义全局变量/常量

abstract public void print(); // 定义抽象方法

// 抽象类不能直接实例化,抽象类的子类如果不是抽象类那么一定要实现所有的抽象方法

}

class AbstractZiLei extends Abstract{ // 定义抽象子类

}

public class AbstractTestDemo {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// 接口和抽象类interface,abstract

// 抽象类:含有抽象方法的类叫做抽象类用abstract修饰的

new Abstract(){

public void print() { // 实现子类方法

n(INFO);

}

Java学习笔记整理——李兴华视频归纳

}

};

public void print() {

n(INFO); // 匿名抽象类实现

}

// 抽象类能不能被final修饰呢?final定义的类为终结类,抽象类是需要子类来实现的

// final abstract class Abstract{ //... } // 编译报错

}

3、object类和包装类进一步讨论

/**

* @author Administrator

*

* @description Object类学习测试类

* @history

*/

public class ObjectTestDemo {

/**

*@description

*@param args

* @throws ClassNotFoundException

*/

public static void main(String[] args) throws ClassNotFoundException {

// Object类学习测试代码

// 1、toString方法

// 2、equals和hashCode方法

// 3、getClass方法

ObjectTestDemo otd = new ObjectTestDemo();

n(otd);

n(ng());// 现实调用toString方法

/*

* Object类中toString方法

* public String toString() {

return getClass().getName() + "@" + tring(hashCode());

}

* Object类中equal方法

* public boolean equals(Object obj) {

return (this == obj);

}*/

// 定义昵称和年龄属性,如果昵称和年龄相同则equal方法返回true

ObjectTestDemo otd1 = new ObjectTestDemo();

me = "eclipse";

= 20;

ObjectTestDemo otd2 = new ObjectTestDemo();

Java学习笔记整理——李兴华视频归纳

}

}

me = "eclipse";

= 20;

n(otd1==otd2); // false

n((otd2)); // 如果不覆写的话返回的一直是false

// hashCode方法和equals方法的关系,没有绝对的关系

// 具体参看源代码的注释说明,在实际用中尽量同时覆写这两个方法,保持一致性

// public final native Class<?> getClass();

// getClass方法是一个本地方法,调用底层代码,返回当前对象对应的一个类对象实例

// 类对象实例,理解为内存中对应的那份字节码对象,java反射内容初步学习

// 通过字节码对象构造出一个个的对象实例

Class claz = ss();

Class claz1 = ;

Class claz2 = e("ObjectTestDemo"); // 类的完整路径

n(ss()); // class ObjectTestDemo

// VM内存中只会产生一份字节码对象

n(claz == claz1); // true

// 方法模拟,添加两个属性昵称和年龄

private String nickname;

private int age;

// 注意参数类型不要写成了ObjectTestDemo

public boolean equals(Object obj) {

}

public String toString(){

return "helloworld"; //覆写toString方法,返回helloworld

}

ObjectTestDemo otd = (ObjectTestDemo) obj; // 向上转型,强制转换

if (this == otd) {

}

if (otd instanceof ObjectTestDemo) {

}

return false;

if ((me) && == ) {

}

return true;

return true;

Java学习笔记之三

Java学习笔记整理——李兴华视频归纳

一、Java异常处理机制

/**

* @author Administrator

*

* @description 异常学习测试类

* @history

*/

public class ExceptionDemo {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// Throable类是所有错误和异常的根基类

// Throable类下两个重要的子类Exception和Error

// 1、编写一个常见的异常例子

try {

}

// 2、catch多个种类的异常例子

String s1 = "1";

String s2 = "0"; // String s2 = "eclipse";

try{

int i1 = nt(s1); // 字符串解析成数字

int i2 = nt(s2);

int temp = i1/i2;

int i = 1;

int j = 0;

int r = i / j;

tackTrace();

// Exception in thread "main" eticException: / by zero

} catch (ArithmeticException ae) {

} catch(ArithmeticException ae){

tackTrace(); // 分母为0异常捕获

} catch(NumberFormatException nfe){

tackTrace(); // 数字格式转换异常捕获

}

// 3、异常可以往上抛出去例子

int[] array = new int[5];

try{

int i3 = array[5]; // 数组越界异常

} catch(ArrayIndexOutOfBoundsException aiobe){

Java学习笔记整理——李兴华视频归纳

}

}

}

// 捕获异常后往外抛出

// 在某一层统一处理掉这些异常,比如可以采用拦截器

throw aiobe;

// 4、自定义异常类,继承自Exception类

try{

// 实例化内部类对象比较特殊点

ExceptionDemo out = new ExceptionDemo(); // 先实例化外部类对象

throw MyException("hello-exception"); // 再实例化内部类对象

} catch(MyException me){

}

// hello-exception

n(alizedMessage());

// 自定义异常类

class MyException extends Exception{

}

public MyException(String msg){

}

super(msg);

二、Java多线程编程

/**

* @author Administrator

*

* @description Java多线程编程入门测试类

* @history

*/

// 方法一、继承线程类Thread

class MyThread extends Thread{

}

// 方法二、实现Runnable接口

class MyThread2 implements Runnable{

public void run() {

public MyThread(String threadName){ // 设置当前线程的名称

currentThread().setName(threadName);

}

public void run(){

}

n(tThread().getName());

Java学习笔记整理——李兴华视频归纳

}

}

n(tThread().getName());

public class SynTestDemo {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// 1、线程的定义、线程和进程的区别、为什么要引入线程等

// 2、Java实现多线程的方法主要有两种:继承Thread类和实现Runnable接口

// 3、多个线程并发同时访问公共的临界资源的时候需要进行同步处理,过多的同步不当会造成死锁

MyThread t1 = new MyThread("hello-thread");

(); // 启动线程1

MyThread2 t2 = new MyThread2();

问题

}

/**

new Thread(t2).start(); // 启动线程2

}

* @author Administrator

*

* @description 多线程编程演练例子

* @history

*/

public class SynABCTest {

/**

* @description

* @param args

*/

public static void main(String[] args) {

}

// 通过具体的例子来加深对多线程的认识

// 问题为:循环打印10遍ABC

PrintThread p1 = new PrintThread(0, "A"); // 参数为线程标志和打印的内容

PrintThread p2 = new PrintThread(1, "B");

PrintThread p3 = new PrintThread(2, "C");

// 启动线程A B C

new Thread(p1).start();

new Thread(p2).start();

new Thread(p3).start();

Java学习笔记整理——李兴华视频归纳

}

// 采用实现接口的方式定义线程类

class PrintThread implements Runnable {

}

/**

* @author Administrator

*

* @description 死锁模拟测试类

* @history

*/

public class DeadLockTest {

/**

*@description

*@param args

public void run() {

}

while ( < 10) { // 打印的次数

synchronized (lock) {

}

while (!( == index % 3)) { // 从0开始执行

try {

}

(); // 打印出内容

++; // 当前线程打印次数++

index++; // 线程切换下一个

(); // 阻塞掉

} catch (InterruptedException e) {

}

tackTrace();

// 标记执行当前应该执行的线程0、1、2依次表示A B C

// 定义成静态变量,因为线程各自使用独立的栈

private static int index = 0;

private static Object lock = new Object();

private int key = 0; // 线程标志

private int print = 0; // 打印的次数

private String name; // 打印的内容

public PrintThread(int key, String name) {

}

= key;

= name;

All(); // 唤醒其他等待的线程

}

Java学习笔记整理——李兴华视频归纳

*/

public static void main(String[] args) {

// 过多的同步操作可能会造成死锁问题,死锁产生的原因是形成了环路等待

// 通过两个线程对象进行模拟,线程A完成一个操作需要资源1和资源2,线程B也是一样

// 在资源分配的过程中,线程A占用了资源1,等待资源2,此时此刻线程B占用了资源2,等待资源1

DeadThread dt1 = new DeadThread("1", true);

DeadThread dt2 = new DeadThread("2", false);

new Thread(dt1).start(); // 启动线程1

new Thread(dt2).start(); // 启动线程2

}

// 定义静态内部类、类似外部类了

static class DeadThread implements Runnable{

/**

* 定义资源1和资源2 lock1和lock2

*/

private static Object lock1 = new Object();

private static Object lock2 = new Object();

private String name; // 线程名称

private boolean run; // 执行顺序标记

public DeadThread(String name,boolean run){

}

@Override

public void run() {

if(){

// 线程1先占用资源1

synchronized(lock1){

}

// 线程2先占用资源2

synchronized(lock2){

try {

n("thread2 used lock2");

try {

n("thread1 used lock1");

(3000); // 暂时休眠3秒

} catch (InterruptedException e) {

}

// 线程1再去申请资源2,此时资源2已经被线程2占用着不放了

synchronized(lock2){

}

n("hello dead-lock");

tackTrace();

= name;

= run;

}else{

Java学习笔记整理——李兴华视频归纳

}

}

}

}

}

(3000); // 线程2暂时休眠3秒

} catch (InterruptedException e) {

}

// 线程2再去申请资源1,此时资源1已经被线程1占用着不放了

synchronized(lock1){

}

n("hello dead-lock");

tackTrace();

class MyThread1 implements Runnable {

}

/**

* @author Administrator

*

* @description 通过修改标记位停止线程

* @history

*/

public class ThreadStopDemo {

public static void main(String[] args) {

MyThread1 my = new MyThread1();

Thread t = new Thread(my, "线程"); // 建立线程对象

(); // 启动线程

try {

(50); // 适当地延迟下

} catch (Exception e) {

}

tackTrace();

private boolean flag = true; // 定义标志位

public void run() {

}

public void stop() {

= false; // 修改标志位

}

int i = 0;

while () {

}

n(tThread().getName() + "运行,i = "

+ (i++));

Java学习笔记整理——李兴华视频归纳

}

(); // 修改标志位,停止运行

}

三、Java常用类库

/**

* @author Administrator

*

* @description Java常用类-StringBuffer学习

* @history

*/

public class StringBufferTest {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// StringBuffer类在处理字符串时候比较常用

// 1、StringBuffer类的append方法

// 具体的方法参数个数和类型,请参看JDK的API即可

StringBuffer sb = new StringBuffer();

("helloworld"); // string类型

("n"); // 特殊符号,换行符

(false); // boolean类型

('j'); // char类型

(1.50d); // double类型

// ... 等等

(0, "eclipse"); // 在index出插入值

e(); // 反转操作

e(1, 3, "helloeclipse"); // 替换操作

ing(1, 5); // 字符串截取操作

(0, 1); // 删除操作

f("hello"); // index出现的位置

// 2、StringBuffer类的引用传递

StringBuffer sb1 = new StringBuffer();

("hello");

fun(sb1);

n(ng()); // helloworld

// 3、StringBuffer类和String类的区别

// 一个可变、一个不可变,具体选择根据具体的场景

}

private static void fun(StringBuffer sb1) {

Java学习笔记整理——李兴华视频归纳

}

("world"); // 改变对应的值

}

import ption;

/**

* @author Administrator

*

* @description Runtime类学习测试

* @history

*/

public class RuntimeTest {

/**

* @description

* @param args

*/

public static void main(String[] args) {

// Runtime类是一个封装了JVM进程的类,每一个java应用程序都有一个JVM实例来支持

// 因此每个JVM进程对应一个Runtime类的实例对象,由java虚拟机来实例化对象

// 查看源代码发现,其构造方法被私有化了,类似单例模式

/*

* public class Runtime {

private static Runtime currentRuntime = new Runtime();

public static Runtime getRuntime() {

return currentRuntime;

}

private Runtime() {} }

// 2、Runtime类一般和Process类一起使用,可以打开本机的一些进程

Process p = null; // 定义进程变量

try {

p = (""); // 打开记事本程序

*/

Runtime run = time(); // 通过静态方法获取实例对象

// 1、查看一些JVM内存级别的参数

n(ory()); // 最大内存空间

n(mory()); // 空间的内存空间

String str = "";

for (int i = 0; i < 10000; i++) {

}

n(mory()); // 空间的内存空间

(); // 进行垃圾回收处理

n(mory());

str += i;

Java学习笔记整理——李兴华视频归纳

}

/*public Process exec(String command) throws IOException {

return exec(command, null, null);

}*/

// 底层有个ProcessBuilder类处理执行这些命令

} catch (IOException e) {

}

try {

(5000); // 让记事本程序执行5秒后关闭掉

} catch (Exception e) {

}

tackTrace();

y(); // 结束此进程

}

import tream;

class Demo{

}

import tream;

class Demo{

}

public class SystemTest {

/**

*@description

*@param args

*/

public static void main(String[] args) {

// System类和上面说到的Runtime类一样也是比较靠近虚拟机实例的类

// 1、我们经常使用的方式是打印输出操作n("hello world");

// PrintStream extends FilterOutputStream extends OutputStream

PrintStream out = ; // 获取打印流

n("helloworld"); // 打印输出

public Demo(){}

// 覆写该方法,测试System调用gc方法的过程

protected void finalize() throws Throwable {

}

n("hello-finalize");

public Demo(){}

// 覆写该方法,测试System调用gc方法的过程

protected void finalize() throws Throwable {

}

n("hello-finalize");

Java学习笔记整理——李兴华视频归纳

}

// 2、通过该类获取系统时间操作

// public static native long currentTimeMillis();

long current = tTimeMillis();

n(current); // 毫秒级别

// 3、查看系统的属性值情况

perties().list(out);

// =Java(TM) SE Runtime Environment

// =C:Program FilesJavajre6bin

// n=20.1-b02

// =Sun Microsystems Inc.

// =/

// ...等等系统值

// Properties extends Hashtable

// Key-Value的键值对形式,实现了Map接口的类

n(perty("")); // Windows 7

/*public static String getProperty(String key) {

checkKey(key);

SecurityManager sm = getSecurityManager();

if (sm != null) {

ropertyAccess(key);

}

return perty(key);

}*/

// 4、释放内存空间方法调用

// 在之前的笔记中说到了Object类,其中有个finalize方法

// protected void finalize() throws Throwable { }

Demo demo = new Demo();

demo = null; // 断开引用设置为null

(); // 强制性/显示释放内存空间,打印输出hello-finalize

// 调用的是Runtime类的释放方法

/*public static void gc() {

time().gc();

}*/

}

import xception;

import DateFormat;

import ;

/**

Java学习笔记整理——李兴华视频归纳

* @author Administrator

*

* @description 时间帮助工具类

* @history

*/

public class DateHelperUtil {

/**

*@description 对传入的date类型时间转换成字符串格式的时间

*@param date

*@return 返回字符串格式时间

*/

public static String formatDate(Date date){

}

/**

*@description 对传入的date类型时间转换成字符串格式的时间

*@param date

*@param formatStr 格式模板

*@return 返回字符串格式时间

*/

public static String formatDate(Date date,String formatStr){

}

/**

*@description 对传入的字符串格式的时间进行解析处理成date类型

*@param dateStr

*@return

* @throws ParseException 解析错误异常

*/

public static Date parseDate(String dateStr) throws ParseException{

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:");

SimpleDateFormat sdf = new SimpleDateFormat(formatStr);

return (date);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:");

return (date);

/**

* @description 获取当前时间的字符串格式

* @return

*/

public static String getNowDate() {

}

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:");

return (new Date());

Java学习笔记整理——李兴华视频归纳

}

}

return (dateStr);

/**

*@description 对传入的字符串格式的时间进行解析处理成date类型

*@param dateStr

*@param formatStr 解析字符串的时间模板

*@return

*@throws ParseException 解析错误异常

*/

public static Date parseDate(String dateStr, String formatStr) throws

}

/**

*@description 获取当前时间的时间戳

*@return

*/

public static String getTimeStamp() {

}

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

return (new Date());

SimpleDateFormat sdf = new SimpleDateFormat(formatStr);

return (dateStr);

ParseException {

import eger;

/**

* @author Administrator

*

* @description BigInteger大数学习测试类

* @history

*/

public class BigIntegerDemo01 {

/**

*@description

*@param args

*/

public static void main(String args[]) {

BigInteger bi1 = new BigInteger("123456789"); // 声明BigInteger对象

BigInteger bi2 = new BigInteger("987654321"); // 声明BigInteger对象

n("加法操作:" + (bi1)); // 加法操作

n("减法操作:" + ct(bi1)); // 减法操作

Java学习笔记整理——李兴华视频归纳

}

n("乘法操作:" + ly(bi1)); // 乘法操作

n("除法操作:" + (bi1)); // 除法操作

n("最大数:" + (bi1)); // 求出最大数

n("最小数:" + (bi1)); // 求出最小数

BigInteger result[] = AndRemainder(bi1); // 求出余数的除法操作

n("商是:" + result[0] + ";余数是:" + result[1]);

}

class Student implements Comparable { // 指定类型为Student

private String name;

}

public class ComparableDemo01 {

public static void main(String[] args) {

Student stu[] = { new Student("张三", 20, 90.0f),

new Student("李四", 22, 90.0f), new Student("王五", 20, 99.0f),

public int compareTo(Student stu) { // 覆写compareTo()方法,实现排序规则的应用

if ( > ) {

}

}

return -1;

return 1;

if ( > ) {

}

return 1;

return -1;

return 0;

} else if ( < ) {

} else {

} else if ( < ) {

} else {

public String toString() {

}

return name + "tt" + + "tt" + ;

public Student(String name, int age, float score) {

}

= name;

= age;

= score;

private int age;

private float score;

Java学习笔记整理——李兴华视频归纳

}

}

new Student("赵六", 20, 70.0f), new Student("孙七", 22, 100.0f) };

(stu); // 进行排序操作

for (int i = 0; i < ; i++) { // 循环输出数组中的内容

n(stu[i]);

}

class BinaryTree {

public void printNode() { // 输出的时候采用中序遍历

if ( != null) {

}

ode(); // 输出左子树

}

( + "t");

if ( != null) {

}

ode();

public void addNode(Node newNode) {

}

// 确定是放在左子树还是右子树

if (eTo() < 0) { // 内容小,放在左子树

if ( == null) {

}

if (eTo() >= 0) { // 放在右子树

if ( == null) {

}

= newNode; // 没有右子树则将此节点设置成右子树

} else {

e(newNode); // 继续向下判断

}

= newNode; // 直接将新的节点设置成左子树

} else {

e(newNode); // 继续向下判断

}

class Node { // 声明一个节点类

private Comparable data; // 保存具体的内容

private Node left; // 保存左子树

private Node right; // 保存右子树

public Node(Comparable data) {

}

= data;

Java学习笔记整理——李兴华视频归纳

}

}

private Node root; // 根元素

public void add(Comparable data) { // 加入元素

}

public void print() {

ode(); // 通过根节点输出

}

Node newNode = new Node(data); // 定义新的节点

if (root == null) { // 没有根节点

root = newNode; // 第一个元素作为根节点

} else {

e(newNode); // 确定是放在左子树还是放在右子树

}

public class ComparableDemo02 {

}

import DateFormat;

import ;

import ;

import ask;

/**

* @author Administrator

*

* @description 任务调度程序学习类

* @history

*/

public static void main(String[] args) {

}

BinaryTree bt = new BinaryTree();

(8);

(3);

(3);

(10);

(9);

(1);

(5);

(5);

n("排序之后的结果:");

();

Java学习笔记整理——李兴华视频归纳

class MyTask extends TimerTask{ // 任务调度类都要继承TimerTask

public void run(){

}

public class TashTestDemo {

}

/**

* @description

* @param args

*/

public static void main(String args[]) {

Timer t = new Timer(); // 建立Timer类对象

MyTask mytask = new MyTask(); // 定义任务

SimpleDateFormat sdf = null ;

sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:") ;

n("当前系统时间为:" + (new Date())) ;

}

le(mytask, 1000, 2000); // 设置任务的执行,1秒后开始,每2秒重复

}

Java学习笔记之四

一、Java IO 编程

1、基本概念

Java中对文件的操作是以流的方式进行的,流是Java内存中一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后还可以将这些流写到另外的目的地(文件、内存、控制台、网络)之所以叫做流,是因为这个数据序列在不同时刻所操作的是源的不同部分。

2、流的分类

流的分类方式一般有以下三种:

(1) 输入的方向分:输入流和输出流,输入和输出的参照对象是Java程序。

(2) 处理数据的单位分:字节流和字符流,字节流读取的最小单位是一个字节。

(3) 功能的不同分:节点流和处理流,一个是直接一个是包装的。

3、流分类的关系

流分类的根源来自四个基本的类,这四个类的关系如下:

输入流

输出流

字节流

InputStream

OutputStream

字符流

Reader

Writer

4、其他知识补充

(1)什么是IO

IO(Input/Output)是计算机输入/输出的接口,Java的核心库提供了全面的IO接口,包括:文件读写、标准设备输出等等。Java中的IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

(2)流IO和块IO

此外,Java也对块传输提供支持,在核心库中采用的便是块IO,流IO和块

Java学习笔记整理——李兴华视频归纳

IO对比而言,流IO的好处是简单易用,缺点是效率不如块IO;相反块IO是效率比较高但是编程比较复杂。Java的IO模型设计非常优秀,它使用了Decorator模式,按照功能进行划分stream,编程过程中可以动态地装配这些stream,以便获取所需要的功能。

备注:以上资料提取自百度文库,链接地址如下:

/view/

5、代码模拟实战

类结构图示:

基础类File

import ;

import ption;

/**

* @author Administrator

*

* @description 基础File类操作

* @history

*/

public class FileDemoTest {

// 1、创建和删除文件

File file = new File("d:");

// File file = new File("d:"+tor+"");

NewFile(); // 创建文件

if (()) { // 如果文件存在,则删除文件

();

}

/**

* @description

* @param args

* @throws IOException IO异常处理

*/

public static void main(String args[]) throws IOException {

// Windows系统下的文件目录格式,这个和Unix系统等不同

// String pathSeparator = parator; // ;

// String separator = tor; //

Java学习笔记整理——李兴华视频归纳

}

import ;

import ption;

import tream;

import putStream;

/**

* @author Administrator

*

* @description InputStream类学习测试代码

* @history

*/

public class InputStreamDemo {

/**

* @description 字节流:输入流InputStream

* @param args

* @throws IOException

*/

public static void main(String args[]) throws IOException {

// 字节流的输入流和输出流过程步骤比较固定

// 第1步、使用File类找到一个文件

File f = new File("d:" + tor + "");

// 第2步、通过子类实例化父类对象(InputStream为抽象类,本身不能直接实例化)

InputStream input = new FileInputStream(f);

// 第3步、进行读操作

byte b[] = new byte[(int)()]; // 数组大小由文件大小来确定

for (int i = 0; i < ; i++) {

}

// 3、遍历文件或者文件夹操作

File file3 = new File("d:");

// File file3 = new File("d:"+tor);

File files[] = les(); // 列出全部内容

for (int i = 0; i < ; i++) {

}

n(files[i]);

// 2、创建文件夹操作

File file2 = new File("d:helloworld");

// File file2 = new File("d:"+tor+"helloworld");

(); // 建立文件夹

if (ctory()) {

n("hello-directory"); // 判断是否是目录

}

Java学习笔记整理——李兴华视频归纳

}

}

b[i] = (byte) (); // 读取内容

}

// 第4步、关闭输出流

();

/**

* @author Administrator

*

* @description

* @history

*/

public class OutputStreamDemo {

}

/**

*@description 字节流:输出流OutputStream类

*@param args

*@throws Exception

*/

public static void main(String args[]) throws IOException {

// 输入和输出流参考的是Java程序,输出流操作步骤也比较固定

// 第1步、使用File类找到一个文件

File f = new File("d:" + tor + "");

// 第2步、通过子类实例化父类对象

OutputStream out = new FileOutputStream(f);

// 第3步、进行写操作

String str = "say hello world!!!";

byte b[] = es();

for(int i=0;i<;i++){

(b[i]); // 单个写入

}

// (b);

// 重载方法write

// public abstract void write(int b) throws IOException;

// public void write(byte b[]) throws IOException {}

// 第4步、关闭输出流

(); // 关闭输出流

}

Java学习笔记整理——李兴华视频归纳

import ;

import ption;

import ;

import ader;

/**

* @author Administrator

*

* @description 字符流:输入流Reader

* @history

*/

public class ReaderDemo {

/**

*@description 字节流和字符流按照处理数据的单位划分

*@param args

*@throws IOException IO异常处理

*/

public static void main(String args[]) throws IOException {

// 第1步、使用File类找到一个文件

File f = new File("d:" + tor + "");

// 第2步、通过子类实例化父类对象

Reader input = new FileReader(f);

// 第3步、进行读操作

char c[] = new char[1024];

int temp = 0;

int len = 0;

while ((temp = ()) != -1) {

// 如果不是-1就表示还有内容,可以继续读取

c[len] = (char) temp;

len++;

Java学习笔记整理——李兴华视频归纳

}

}

}

// 第4步、关闭输出流

();

import ;

import ption;

import ;

import iter;

/**

* @author Administrator

*

* @description

* @history

*/

public class WriterDemo {

}

import rayInputStream;

import ;

import putStream;

import tputStream;

import ption;

import tream;

import treamReader;

import StreamWriter;

import ;

/**

*@description 通过代码学习发现,基本上步骤一致的

*@param args

*@throws IOException

*/

public static void main(String args[]) throws IOException {

// 第1步、使用File类找到一个文件

File f = new File("d:" + tor + "");

// 第2步、通过子类实例化父类对象

Writer out = new FileWriter(f); // 通过对象多态性,进行实例化

// 第3步、进行写操作

String str = "nsay hellotworld";

(str);

// 第4步、关闭输出流

// (); // 清空缓冲

(); // 关闭输出流

}

Java学习笔记整理——李兴华视频归纳

import ;

public class ByteAndCharStreamTest {

}

/**

*@description 字节流:InputStream,OutputStream

* 字符流:Reader,Writer

* // 字节流和字符流相互转换测试

*@param args

* @throws IOException 文件操作异常处理

*/

public static void main(String[] args) throws IOException {

// 1、输入流-字节流转换成字符流

// 通过InputStreamReader类来进行转换

InputStream is = new FileInputStream("d:");

Reader reader = new InputStreamReader(is); // 将字节流转换成字符流

char c[] = new char[1024];

int len = (c); // 读取操作,保存在字符数组中

(); // 关闭操作

n(new String(c,0,len)); // 字符数组转换成String类实例

// 2、输出流-字节流转换成字符流

// 通过OutputStreamWriter类来进行转换

File f = new File("d:" + tor + "");

Writer out = new OutputStreamWriter(new FileOutputStream(f)); // 字节流变为("hello world!!!"); // 使用字符流输出

();

// 3、从字符流到字节流转换可以采用String类提供的操作

// 从字符流中获取char[],转换成String实例然后再调用String API的getBytes()方法

// 接1中的代码如下,最后通过ByteArrayInputStream即可完成操作

String str = new String(c,0,len);

byte b[] = es();

InputStream is2 = new ByteArrayInputStream(b);

();

// 4、其他常见的流

// 内存操作流ByteArrayInputStream,ByteArrayOutputStream

// 管道流PipedOutputStream,PipedInputStream

// 打印流PrintStream

// 缓存流BufferedReader

字符流

// ...等等

}

Java学习笔记整理——李兴华视频归纳

字符编码学习代码

import tputStream;

import ption;

import Stream;

public class CharSetDemo {

}

对象序列化学习代码

对象序列化:将对象转换成二进制的字节流,反序列化刚好相反。

import putStream;

import tputStream;

import tream;

import InputStream;

import Stream;

import OutputStream;

import izable;

class Demo implements Serializable{ // 实现序列化接口

// 序列化方式之一,Java自身提供的序列化支持

// 其他序列化方式,待以后有需要进一步学习

private static final long serialVersionUID = 1L;

private String info; // 定义私有属性

// 如果某个属性不想被序列化,采用transient来标识

//private transient String noser;

public Demo(String info){

/**

* @description 字符编码学习测试方法

* @param args

* @throws IOException 文件IO异常处理

*/

public static void main(String[] args) throws IOException {

}

// 1、字符编码,通过system类来获取

String fe = perty("ng");

n(fe); // GBK

// 2、进行转码操作

OutputStream out = new FileOutputStream("d:");

byte b[] = "Java,你好!!!".getBytes("ISO8859-1"); // 转码操作

(b); // 保存

(); // 关闭

Java学习笔记整理——李兴华视频归纳

}

}

= info;

public String getInfo() {

}

public void setInfo(String info) {

}

public String toString() {

}

return "info = " + ;

= info;

return info;

public class SerializedDemo {

}

/**

*@description 对象序列化、反序列化操作

*@param args

*@throws Exception

*/

public static void main(String[] args) throws Exception {

}

// 1、对象序列化是将内存中的对象转换成二进制形式的数据流

// 2、对象反序列化刚好和对象序列化方向相反,将二进制数据流转换成对象

// a、对象序列化采用ObjectOutputStream类

ObjectOutputStream oos = null; // 声明对象输出流

OutputStream out = new FileOutputStream("d:");

oos = new ObjectOutputStream(out);

bject(new Demo("helloworld"));

();

// b、对象反序列化采用ObjectInputStream类

ObjectInputStream ois = null; // 声明对象输入流

InputStream input = new FileInputStream("d:");

ois = new ObjectInputStream(input); // 实例化对象输入流

Object obj = ject(); // 读取对象

();

n(obj);

二、Java类集合框架

比较详细的笔记:

/view/

一个思考题目:如何实现一个stack,使得增加、删除、获取最大值、最小值以及中值的时间操作效率相当。

/**

Java学习笔记整理——李兴华视频归纳

* @author Administrator

*

* @description 如何从java类集框架中选取适当的数据结构呢???

* @history

*/

public interface Stack {

public void add(T t); // 添加元素

public void delete(T t); // 删除元素

public T getMax(); // 获取最大值

public T getMin(); // 获取最小值

public T getMiddle(); // 获取第中间大值

}

Java基础学习笔记整理

本文发布于:2024-02-08 13:59:48,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170737198867664.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   对象   操作   定义   线程   实例
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23