流程控制
- 顺序结构
- 分支结构
- 循环结构
break
终止结束循环
for (int i = 0; i < 20 ;i ++ )
{
if (i == 3)
{
break;
}
}
outer:
for (int i = 0; i < 20 ;i ++ )
{
for (int j = 0; j < 10; j++)
{
System.out.println("i:"+i+",j:"+j);
if (j > 2)
{
break outer;//跳出标签所在的循环。
}
}
}
continue
忽略剩下的语句,执行下一次循环
带标签时,可以忽略标签,
outer:
for (int i = 0; i < 20 ;i ++ )
{
for (int j = 0; j < 10; j++)
{
System.out.println("i:"+i+",j:"+j);
if (j > 2)
{
continue outer;//忽略标签所在的循环剩下的语句,进入标签所在循环的下一个。
}
}
}
数组
java类型:基本类型:8个
引用类型:数组、类、接口、枚举。
数组就是一种引用类型。任何已有类型,添加一组方括号就变成了数组类型。
// int -> int[]
// long -> long[]
// String -> String[]
// double -> double[]
// int[] -> int[][]
// long[][] -> long[][][]
//
创建数组对象
动态
静态
所有数组元素为数值型时,初始值为0;
默认的值:
引用类型 null;
boolean false;
深入理解数组
数组是引用类型,引用类型和基本类型的区别在哪里?
java程序的内存可以分为:
-
堆内存(heap):java虚拟机启动时分配的一块永久的,很大的内存区。堆内存只有一块。
-
栈内存(stack):每次方法运行分配一块临时、很小的内存区。每个方法都有自己对应栈区,方法结束时,对应的栈区就会被回收。
-
在方法中定义的、局部变量(不管什么类型),都放入对应的方法栈区。
-
new出来的东西,都在堆内存。堆内存中的对象,如果没有应用变量指向它,那他就会变成垃圾,等待Vm回收。
计算机的每个内存单元(byte、字节)在操作系统都有一个编号,就像一栋大楼要为每个房间编号一样。
-
基本类型的赋值:直接将该值放入变量所在的内存。
面向对象
-
总决:定义类、创建对象、调用方法。
-
定义类:
【修饰符】class 类名
{
//成员变量(field)
//方法(method)
//构造器(constructor)
//内部类(nested class)
//初始化块
}--------------------------类体(有且只有以上5个)
public class 面视题 { int age = 20; double de;//成员变量 de = 3.4;//赋值语句。报错 }
类中5大成员!3大类型:类、接口、枚举!4个修饰符!
- 修饰符:public、final | abstract。有且仅有。
- 类名:语法要求(只要是标识符即可)。多个单词连缀而成,每个单词首字母大写。
-
成员变量(field)
-
[修饰符] 类型 变量名 【=初始值】
-
修饰符:private | protected | public 、final 、static 、(transient:序列化相关)
-
类型:任意基本类型或引用类型
-
变量名:语法要求,只要是标识符即可。驼峰命名法,首字母小写,后面每个单词首字母大写。用于描述该类或对象的状态,建议用名词。
-
-
方法(method)
-
【修饰符】 返回值类型 方法名(形参列表)
{
//代码:定义变量(包括数组)、变量赋值、流程控制、
}--------------------方法体
-
修饰符:private | protected | public 、final | abstract 、 static
-
返回值类型:任意基本类型或引用类型。可使用void声明没有返回值。
-
方法名:语法要求:只要是标识符即可:驼峰写法。用于描述该类或对象的行为,通常时动词。只定义项目感兴趣的行为
-
形参列表:形参类型 形参名
-
-
构造器
作用:new调用构造器来创建对象。如果你没有为类写构造器,系统会默认为该类提供一个无参的构造器。构造器很像一个特殊的方法,没有返回值类型声明。构造器必须与类名相同。构造器的作用:用于初始化对象----构造器永远属于实例。他不可能用static修饰。
-
【修饰符】构造器名(形参列表)
{
//代码:定义变量(包括数组)、变量赋值、流程控制、
}-------------构造体
-
构造器名必须与类名相同.
判断一个体是否为构造器,要看两点:名称与类名相同。没有返回值类型。
-
修饰符:private | protected | public
-
-
-
类可以用来做什么?
- 所有的类都是引用类型。所有的类都可用于声明变量。很多没有main方法的类就是为主类服务的。
- 调用static修饰的方法或static修饰的变量。
- 创建对象。new构造器(参数)。
- 派生子类。
-
对象可以用来做什么?
- 调用无static修饰的成员变量。(实例变量)
- 调用无static修饰的方法。(实例方法)
-
-
this关键字
this可以出现非static的方法、构造器中。作用如下:
-
出现非static方法中,this代表该方法的调用者。“谁调用该方法,this就代表谁”
-
出现在构造器中,this代表该构造器正在初始化的对象。构造器用于对对象进行初始化
this.的作用:用于区分方法或构造器的局部变量(尤其是与成员变量同名时)
public class Apple { String color; double weight; public Apple(String color , double weight) { this.color = color; this.weight = weight; } }
-
-
方法详解:
-
方法类似于函数。但与函数不同的是,方法不能存在,方法必须定义在类里面。
-
定义在类中的方法。从逻辑上来看,如果该方法有static修饰,该方法属于类本身,应该用类调用
如果该方法无static修饰,该方法属于对象本身。
-
方法不能独立执行。方法一定要看调用者。如果在调用同一个类中的方法,可以省略调用者,此时系统会添加默认的调用者。如果该方法是无static修饰的方法,添加this作为默认的调用者。
-
-
形参个数可变的方法:
类型… 形参名:形参个数可变的方法。实际是数组,写法上等价于:类型[] 形参名
类型… 这样写的好处:调用方法时更加方便。即可直接传入多个元素,系统会自动将他们封装成数组。缺点:只能作为形参列表的最后一个元素。一个方法最多只能有一个参数可变的形参;
递归方法
方法调用自身–递归带来了隐式循环。要避免无限递归。一定要在可能出现的某些情况下,不在调用方法自身。
递归要向已知方向发展。
方法重载
在同一个类中,有多个同名的方法,但这多个方法的形参列表不同。
三同一不同。同一个类、返回值类型、方法名相同。参数列表不同。
修饰符不同不算重载。
参数传递
java是值传递,传递的是参数的一个副本。如果
\\交换值 public class A { public static void swap(int a, int b) { int tem = a; a = b; b = tem; } public static void main(String[] args) { int a = 6; int b = 9; A.swap(a,b); System.out.println(a);//6 System.out.println(b);//9 } } class DataWrap { int a = a; int b = b; } public class B { public static void swap(DataWrap dw) { int tem = dw.a; dw.a = dw.b; dw.b = tem; } public static void main(String[] args) { DataWrap dw = new DataWrap(); dw.a = 6; dw.b = 9; B.swap(dw); System.out.println(dw.a);//9 System.out.println(dw.b);//6 } }
-
如果传递的参数是基本数据类型,方法中对参数所做的修改,完全不会影响参数本身!!
-
如果传递的是引用类型,参数的副本和参数本身指向的是同一个对象,因此方法通过参数副本修改对象时,会影响参数本身所指的对象。
一个.java文件中可以定义多个类,但只能有一个public类。
变量详解
java变量(没有全局变量的概念)
-
成员变量
类中定义成员变量
- 类变量(有static)
- 实例变量(无static)
-
局部变量
方法中定义局部变量(方法在栈中,方法执行完就被销毁)
- 形参
- 普通局部变量
- 代码块的局部变量
注意:
-
成员变量:可以不需要显示指定初始值,系统可以自动分配初始值,初始值规则和数组元素的初始值规则相同。
-
程序中类本身只有一个;程序一定要先有类,再有对象(实例)!
-
类变量:类变量属于类本身,当系统初始化类时,就会为类分别分配空间,并执行初始化。
-
实例变量:实例变量属于对象本身,系统每次创建对象时,都需要为该对象的实例变量分配空间,并执行初始化。
-
严格来说:类变量应该由类本身进行访问。
实例变量,应该由对象进行访问。
但java允许用对象来访问类变量,一个对象修改了类变量以后,其他对象访问的类变量就成了修改之后的。
-
-
- Computer.java
ComputerTest.java
-
局部变量:必须由程序员先显示指定初始值,然后才能使用-----否则编译报错。
-
//代码块的作用域很小,离开代码块,代码块的局部变量就失效了 { int a = 1; } System.out.print(a);//编译报错
方法详解
- 方法所属性:
- 形参个数可变的方法
- 递归方法
- 方法重载(3同一不同)
- 方法传参机制。值传递,传递到是参数的副本。
类变量-------是在第一次用该类,系统会为该类变量分配空间,并初始化。每个类的类变量都只会有一个。
实例变量----每次创建对象,系统都会为该对象的实例变量分配空间,并初始化。
封装
面向对象三大特征:封装、继承、多态。
-
隐藏:隐藏对象的内部实现细节。
-
暴露:将一些操作界面暴露出来。通过暴露的界面来操作对象,该对象的内部状态不会被破坏。
合理隐藏、合理暴露。
访问控制器:
- private -> 不写 -> protected -> public
- private(类访问权限):该修饰符修饰的成员,只能在该类中被访问。(彻底的隐藏)
- 不写(包访问权限):该修饰符修饰的成员,只能在该类、及该类所在包中被访问。
- protected(子类访问权限):该修饰符修饰的成员,只能在该类、及该类所在包、该类的子类中被访问。
- public(公类):该修饰符修饰的成员,可以在任意地方被访问。
private | 不写 | protected | public | |
---|---|---|---|---|
当前类 | √ | √ | √ | √ |
同一个包 | × | √ | √ | √ |
子类 | × | × | √ | √ |
任意 | × | × | × | √ |
- 指定原则:
- 成员变量(实例变量),通常用private修饰,为了隐藏实现细节。
- 为每个成员变量提供public的getter、setter方法,用于控制该成员变量的方法。
- 需要暴露的方法,通常用public 修饰。
- 如果希望一个方法主要用于被子类重写,用protected修饰。
包
不同的公司完全可以定义同名的类,为了解决不同公司、不同项目类名冲突的问题,java就引入“包”机制。就是在类名添加一个前缀。
java程序为类定义包?
-
在源代码中加入package包名。
-
将生成的class文件要放在对应的文件结构下。
-
包命名规范:语法要求,只要求标识符即可。专业要求,推荐用公司域名倒写,再加项目名。
备注:一旦你为类指定了包名之后,使用该类时应该用完整类名:包命+类名。
导入包
import 的作用:为了省略写包名,如果不写import 那么每次都要写类的全名(包命+类名)。
import 包名.类名;=====每次导入一个类
import 包名.*;=====指定包的所有类,星号代表类,不可以代表包。
java默认导入 java.lang包下所有类。
import static 静态导入
可以省略写类名。用于导入指定包下的所有类变量。
import static 包名.类名.静态成员名;======每次导入一个静态成员名
import static 包名.类名.*;==========导入指定类的所有静态成员。
java源程序的结构:
一条package 语句
N个import 语句
N个class定义
构造器详解
构造器规则:
- 构造器用于初始化对象
- 构造器如何调用?必须用new来调用构造器,这样可以返回一个初始化完成的对象。
构造器重载:
-
一个类中可以定义多个构造器,必须要求形参列表不同-------这就是构造器重载。
this调用:this后紧跟一个括号(参数)。this调用代表调用同一个类中重载的构造器—this调用只能出现在构造器的第一行。具体调用哪个构造器看this括号中传入的参数。
this引用:this后紧跟一个点:this.name;