自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

System.out.println();的快捷方式是syso   Alt+/

查看详细                  的快捷方式是Ctrl    鼠标点击

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

 foreach方法遍历就是增强型for循环:如果只是取出数组一个数,比较快捷,但是不能更改数组的值。

但是普通for方法遍历数组,可以去改变数组的值

  

自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 这个代码是输出这个数组的第一个元素,如果将oldArr[ 0]改为 oldArr[ 3]将会输出5,不该将会输出1.

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

String是定义字符串的

方法的创建:返回值+方法名

调用方法:对象.方法名();

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

  自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

遍历:

自学java成神之路

 自学java成神之路

 自学java成神之路

 值传递和引用传递的区别:

指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:

[java] view plaincopy

public class TempTest {
private void test1(int a){
//做点事情
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//这里传递的参数a就是按值传递
}
}

按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

示例如下:

[java] view plaincopy

public class TempTest {
private void test1(int a){
a = 5;
System.out.println(“test1方法中的a=”+a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a=”+a);
}
}
运行结果是:

[java] view plaincopy

test1方法中的a=5
main方法中的a=3

引用传递是什么

指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

示例如下:

[java] view plaincopy

public class TempTest {
private void test1(A a){
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
t.test1(a); //这里传递的参数a就是按引用传递
}
}
class A{
public int age = 0;
}

3:按引用传递的重要特点

传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

示例如下:

[java] view plaincopy

public class TempTest {
private void test1(A a){
a.age = 20;
System.out.println(“test1方法中的age=”+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test1(a);
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
运行结果如下:

[java] view plaincopy

test1方法中的age=20
main方法中的age=20

4:理解按引用传递的过程——内存分配示意图

要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。

用上面的例子来进行分析:

(1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:

(2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:

(3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

内存分配示意如下:

由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:

也就是说:是两个变量都指向同一个空间。

(4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:

此时A实例的age值的变化是由test1方法引起的

(5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20

(6):运行第11行,根据此时的内存示意图,输出main方法中的age=20

5:对上述例子的改变

理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?

方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:

[java] view plaincopy

public class TempTest {
private void test1(A a){
a = new A();//新加的一行
a.age = 20;
System.out.println(“test1方法中的age=”+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test1(a);
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
运行结果为:

[java] view plaincopy

test1方法中的age=20
main方法中的age=10
为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下

6:再次理解按引用传递

(1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:

(2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:

(3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

内存分配示意如下:

由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:

也就是说:是两个变量都指向同一个空间。

(4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:

(5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:

注意:这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的。

(6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20

(7):运行第12行,根据此时的内存示意图,输出main方法中的age=10

7:说明

(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;

java中在参数传递时有2种方式,

        一种是按值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话,运行效率自然就变低了,所以java在传递数据量很小的数据是值传递,比如java中的各种基本类型:int,float,double,boolean等类型的,具体可以自己测试。
  另外一种是按引用传递:引用传递其实就弥补了上面说的不足,如果每次传参数的时候都复制一份的话,如果这个参数占用的内存空间太大的话,运行效率会很底下,所以引用传递就是直接把内存地址传过去,也就是说引用传递时,操作的其实都是源数据,这样的话修改有时候会冲突,记得用逻辑弥补下就好了,具体的数据类型就比较多了,比如Object,二维数组,List,Map等除了基本类型的参数都是引用传递。

重点研究对象和类的概念:

  • 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • :类是一个模板,它描述一类对象的行为和状态。

下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

自学java成神之路

下图中汽车类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。

自学java成神之路

Java中的对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。

拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

对比现实对象和软件对象,它们之间十分相似。

软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

Java 中的类

类可以看成是创建 Java 对象的模板。

自学java成神之路

通过上图创建一个简单的类来理解下 Java 中类的定义:

public class Dog { String breed; int size; String colour; int age; void eat() { } void run() { } void sleep(){ } void name(){ } }

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法。


构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

下面是一个构造方法示例:

public class Puppy{ public Puppy(){ } public Puppy(String name){ // 这个构造器仅有一个参数:name } }


创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

public class Puppy{ public Puppy(String name){ //这个构造器仅有一个参数:name System.out.println("小狗的名字是 : " + name ); } public static void main(String[] args){ // 下面的语句将创建一个Puppy对象 Puppy myPuppy = new Puppy( "tommy" ); } }

编译并运行上面的程序,会打印出下面的结果:

小狗的名字是 : tommy

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

/* 实例化对象 */ Object referenceVariable = new Constructor(); /* 访问类中的变量 */ referenceVariable.variableName; /* 访问类中的方法 */ referenceVariable.methodName();


实例

下面的例子展示如何访问实例变量和调用成员方法:

public class Puppy{ int puppyAge; public Puppy(String name){ // 这个构造器仅有一个参数:name System.out.println("小狗的名字是 : " + name ); } public void setAge( int age ){ puppyAge = age; } public int getAge( ){ System.out.println("小狗的年龄为 : " + puppyAge ); return puppyAge; } public static void main(String[] args){ /* 创建对象 */ Puppy myPuppy = new Puppy( "tommy" ); /* 通过方法来设定age */ myPuppy.setAge( 2 ); /* 调用另一个方法获取age */ myPuppy.getAge( ); /*你也可以像下面这样访问成员变量 */ System.out.println("变量值 : " + myPuppy.puppyAge ); } }

编译并运行上面的程序,产生如下结果:

小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2

源文件声明规则

在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

类有若干种访问级别,并且类也分不同的类型:抽象类和 final 类等。这些将在访问控制章节介绍。

除了上面提到的几种类型,Java 还有一些特殊的类,如:内部类匿名类


Java 包

包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。

import 语句

在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

例如,下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类

import java.io.*;

一个简单的例子

在该例子中,我们创建两个类:Employee 和 EmployeeTest

首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为 Employee.java。

Employee 类有四个成员变量:name、age、designation 和 salary。该类显式声明了一个构造方法,该方法只有一个参数。

Employee.java 文件代码:

import java.io.*; public class Employee{ String name; int age; String designation; double salary; // Employee 类的构造器 public Employee(String name){ this.name = name; } // 设置age的值 public void empAge(int empAge){ age = empAge; } /* 设置designation的值*/ public void empDesignation(String empDesig){ designation = empDesig; } /* 设置salary的值*/ public void empSalary(double empSalary){ salary = empSalary; } /* 打印信息 */ public void printEmployee(){ System.out.println("名字:"+ name ); System.out.println("年龄:" + age ); System.out.println("职位:" + designation ); System.out.println("薪水:" + salary); } }

程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。

下面给出EmployeeTest类,该类实例化2个 Employee 类的实例,并调用方法设置变量的值。

将下面的代码保存在 EmployeeTest.java文件中。

EmployeeTest.java 文件代码:

import java.io.*; public class EmployeeTest{ public static void main(String[] args){ /* 使用构造器创建两个对象 */ Employee empOne = new Employee("RUNOOB1"); Employee empTwo = new Employee("RUNOOB2"); // 调用这两个对象的成员方法 empOne.empAge(26); empOne.empDesignation("高级程序员"); empOne.empSalary(1000); empOne.printEmployee(); empTwo.empAge(21); empTwo.empDesignation("菜鸟程序员"); empTwo.empSalary(500); empTwo.printEmployee(); } }

编译这两个文件并且运行 EmployeeTest 类,可以看到如下结果:

$ javac EmployeeTest.java
$ java EmployeeTest 
名字:RUNOOB1
年龄:26
职位:高级程序员
薪水:1000.0
名字:RUNOOB2
年龄:21
职位:菜鸟程序员
薪水:500.0

自学java成神之路

 自学java成神之路

 自学java成神之路

 要把String类型转化成int的类型的方法:

 Integer.parseInt(b)

 下面的int add(){

}

是一个方法的构造,返回值+方法名:写一个add方法返回值是int类型

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

 new返回的是和类名相同的方法 比如People1、public People1

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 方法里面的参数只能在方法里面,在方法的范围里找不到就会往上面找,在类中找,就用到this

 

自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

 方法的重载

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路 new里面的参数是和构造方法里面对应的

  

自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

 自学java成神之路

  自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路 自学java成神之路

间接实现内部类 

自学java成神之路

 直接实现内部类

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路

 在接口中,全部的方法都是抽象方法

抽象类不能被实例化

自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路  自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

 自学java成神之路

  自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路 自学java成神之路

自学java成神之路 自学java成神之路

  自学java成神之路

 自学java成神之路

 自学java成神之路

         自学java成神之路       自学java成神之路      自学java成神之路   自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路

自学java成神之路自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 synchronized同步锁只允许一个人过去,过去之后另一个才能去

自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

 自学java成神之路

自学java成神之路 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

 自学java成神之路

自学java成神之路

自学java成神之路

 FileReade输出的全是乱码自学java成神之路

 自学java成神之路

 自学java成神之路

· 

上一篇:MySQL(05)触发器&事件&事务&锁


下一篇:Linux基础命令 - grep