目录
实例3:实现一个学生类,需要包含姓名、性别、学号和年龄等属性
1. 配置java编译环境
针对Windows64位:
链接:https://pan.baidu.com/s/1q7p6YbKSyxl4k90DEeBQVw
提取码:fwmy
(1)安装配置jdk
通过以下步骤配置PATH环境变量:
(2)下载、安装IntelliJ IDEA
两种模式下的视图转换:File — settings — color Scheme(Default与Darcula)
(3)建立java源代码输出“Hello World”
-
public
class
Hello {
-
public static void main(String[] args){
-
System.
out.println(
"Hello World.");
-
}
-
}
-
Hello World.
-
-
Process finished
with
exit code
0
(4)通过命令提示窗口运行
- 命令javac和java都是JDK软件包自带的,通过javac命令产生一个.class文件。
2. java基本语法
(1)java程序的构成
- 逻辑构成
程序头包的引用:主要引用JDK软件包自带的包,也可以是自己定义的类,引用之后程序体中就可以自由应用包中的类的方法与属性。
类的定义:可以有多个类的定义,但必须有一个主类,这个主类是程序运行的路口点,在java源程序中,主类的名字同文件名一致。
- 物理构成
语句一行以分号结束。
括号{}界定语句序列。
空白指的是语句之间、块内部、或者块之间的空白行。
- 注释语句
行注释以//开始的行。
块注释以/*...*/开始和结束。
- 标识符、关键字和转义符
标识符:
有字母、数字、下划线(_)、美元符号组成,其中美元符号用的比较少。
标识符从一个字母、下划线、美元符号开始。
java语言中对大小写比较敏感。
标识符没有最大长度限制。
标识符定义不能是关键字。
关键字:
java语言中自带的用于标志数据类型名(如:double)。
转义符:
拥有特殊含义的字符见下表。
(2)数据类型
- java数据类型
- 整数类
采用三种进制:十六进制、八进制、十进制。
十进制:2
八进制:o45
十六进制:oxBACA
具有缺省int。
用字母L或l表示长整型。
所有java中编译语言中的整数类型都是有符号的数字。
- 文本类
必须包含单引号引用的文字。
代表一个16 bit Unicode字符。
- 浮点类
默认类型为double,有f和d两种形式。
- 逻辑类
boolean数据类型有两种:true和false
如:boolean f=true;
(3)变量与常量
- 常量:是指整个运行过程中不在发生改变的量。
- 变量:变量得声明也指变量的创建。
(4)运算符和表达式
- 算术运算符
+(加)、-(减)、*(乘)、/(除)、%(取模运算)、++(增量运算符)、--(减量运算符)
- 关系运算符
==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
- 布尔逻辑运算符
- 位运算符
~(位求反)、&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)、>>>(不带符号右移)
- 赋值运算符
- 其它操作符及其表达式
三目运算符:(?:):
表达式:x?y:z;
判断x是否为真,如果为真则选y,如果为假则选z。
对象运算符:instanceof
- 优先级
3. 流程控制与数组
(1)if-else语句
if(布尔表达式)
{
语句块1;
}
else
{
语句块2;
}
布尔表达式:返回为true时,执行语句1;返回为false时,执行语句2;
(2)switch语句
-
switch(表达式
1)
-
{
-
case 表达式
2:
-
语句;
-
break;
-
case 表达式
3:
-
语句;
-
break;
-
default:
-
语句;
-
break;
-
}
- 表达式1的值必须与整型兼容。
- break表示要跳出这一分支。
- case分支要执行程序语句。
(3)for循环语句
for(初始化表达式;测试表达式;步长){
语句;
}
- 首先运行初始化表达式。
- 然后计算测试表达式,为真时,执行语句块,如果为假,结束for循环。
- 最后执行步长。
(4)while循环
while(布尔表达式){
语句;
}
布尔表达式为true执行语句,否则跳出。
(5)do语句
do{
语句;
}while(布尔表达式);
(6)数组
- 首先是一个对象。
- 存放相同的数据类型。
- 所有数组下标默认值0开始,且访问时候不可以超出定义上限。
- 声明格式
数据类型 标识符[]
如:int tab[];声明数据类型为整型的数组tab。
- 创建数组
由于数组是一个对象,所以用关键字new来创建一个数组。
tab=new int[10]; 创建存储10个整型数据的数组tab。
创建完成后,赋值:
- 每个元素赋值:tab[0]=1
tab[1]=3;
.......
tab[9]=9;
- 直接声明的时候说明其值
int tab[]={1,2,3,4,5};
4. 类
(1)类的定义与声明
- java编程是面向对象的,处理最小的完整单元为对象。
- 类由类声明和类体构成,类体又有变量和方法构成。
- 类声明的基本格式
访问说明符 class 类名 extends 超类名 implements 接口名
- 访问说明符public或者省略。
- 类名:用户自定义类名。
- 超类名:是指已经存在的类名。
- 接口名:接口
- 类体
成员变量格式:访问说明符 数据类型 变量名
- 访问说明符有:public、private、protected。
- public:省略时候默认的公有类型。可以由外部对象进行访问。
- private:私有类型,只允许在类的内部的方法和使用,若从外部访问,则需要建立函数,间接的访问。
- protected:受保护类型,子类访问受到控制。
方法:类的操作定义,标志着类的动态特征。
访问说明符 数据类型 方法名(数据类型1 变量名1,数据类型2 变量名2)
- 使用new进行创建类
(2)类的单继承性
java语言中允许用externs关键字从一个类扩展出一个新类,新类继承超类的成员变量和方法,并且可以覆盖。
(3)特殊变量
两个特殊变量:super和this
- super
类声明中用关键字extends扩展了其超类后,super用在扩展类中引用其它超类中的成员变量。
- this
指向当前变量或者实例。
(4)构造函数
类中的构造函数用来初始化一个类。
(5)包
声明包的格式:Package 包名;
Package为关键字,包名为标识符。
Package语句要作为程序非注释语句的第一行。
包内的类名唯一。
引用包中类时,使用import语句。格式import 包名.类名
5. 集合类的使用
(1)List接口
- List接口
List接口扩展了Collection,可以包含重复元素。元素是有顺序的,每个元素都有一个index值(从0开始)标明元素在列表中的位置。在声明时可以带有一个泛型参数,即List<E> 。实现List接口的主要类有Vector、ArrayList和LinkedList等。Vector和ArrayList以类似数组的形式进行存储,因此它的随机访问速度极快。LinkedList的内部实现是链表,适合于在链表中间需要频繁进行插入和删除操作。
ArrayList/Vector常用方法:
- void add(Object obj) ,添加一个对象
- boolean addAll(Collection col),添加整个集合,如果接收者对象的结果有变化,则返回true
- int size() ,返回元素的个数。
- boolean isEmpty(),如果不含元素,则返回true
- Object get(int pos),返回指定位置的元素
- void set(int pos, Object obj),用参数对象替换指定位置的对象
- boolean remove(Object obj),去除给定对象的第一次出现,如果找到了对象,则返回true。去除一个对象后,其后面的所有对象都依次向前移动。
- Object remove(int pos),去除给定位置的元素,并返回被去除的对象
- boolean removeAll(Collection<?> col),从接收者对象中去除所有在参数对象中出现的元素,如果接收者对象的结果有变化,则返回true
- void clear() ,去除所有的元素
- boolean contains(Object obj),返回是否包含指定的对象,如果包含则返回true;否则,返回false
- boolean containsAll(Collection<?> col),返回是否包含参数col中的所有对象
- int indexOf(Object obj),返回给定对象在Vector /ArrayList中第一次出现的位置,如不存在,则返回-1
(2)Set接口
- Set接口
Set接口扩展了Collection接口,禁止重复的元素,是数学中“集合”的抽象。实现它的两个主要类是哈希集合(HashSet)及树集合(TreeSet)。
(3)Map接口
- Map接口
Map用于存储“关键字”(key)和“值”(value)的元素对,其中每个键映射到一个值,当需要通过关键字实现对值的快速存取时使用。两个主要实现类:TreeMap、HashMap。
Map接口常用方法:
- int size(),返回Map中的元素个数
- boolean isEmpty(),返回Map中是否包含元素,如不包括任何元素,则返回true
- boolean containsKey(Object key),判断给定的参数是否是Map中的一个关键字(key)
- boolean containsValue(Object val),判断给定的参数是否是Map中的一个值(value)
- Object get(Object key),返回Map中与给定关键字相关联的值(value)
- Collection values(),返回包含Map中所有值(value)的Collection对象
- Set keySet(),返回包含Map中所有关键字(key)的Set对象
- Set entrySet(),返回包含Map中所有项的Set对象
- Object put(Object key, Object val),将给定的关键字(key)/值(value)对加入到Map对象中。其中关键字(key)必须唯一,否则,新加入的值会取代Map对象中已有的值
- void putAll(Map m),将给定的参数Map中的所有项加入到接收者Map对象中
- Object remove(Object key),将关键字为给定参数的项从Map对象中删除
- void clear(),从Map对象中删除所有的项
(4)Iterator接口
- Iterator接口
Iterator接口是一个遍历集合元素的工具,并具有从正在遍历的集合中去除对象的能力。具有如下三个实例方法,
- hasNext(),判断是否还有元素
- next(),取得下一个元素
- remove(),去除一个元素。注意是从集合中去除最后调用next()返回的元素,而不是从Iterator类中去除
(5)Collections类
- Collections类
Collections类提供了对集合的操作,包括
- 排序算法sort
对List重新排序,使其中的元素按照某种次序关系升序排列。有两种形式,简单形式只是将元素按照自然次序排列,第二种形式需要一个附加的Comparator对象作为参数,用于规定比较规则,可用于实现反序或特殊次序排序。
- 洗牌算法shuffle
其作用与排序算法恰好相反,它打乱List中的任何次序。也就是说以随机方式重排元素,任何次序出现的几率都是相等的。在实现偶然性游戏的时候,这个算法很有用。
- reverse:将一个List中的元素反向排列
- fill:用指定的值覆写List中的每一个元素,这个操作在重新初始化List时有用
copy:接受两个参数,目标List和源List,将源中的元素复制到目标,覆写其中的内容。目标List必须至少与源一样长,如果更长,则多余的部分内容不受影响。
实例1:使用switch结构计算每个月的天数(考虑闰年)
(1)解析
闰年是可以整除4,但不可以整除100的数,或者直接可以整除400。
java.util.Scanner是Java5的新特征,主要功能是简化文本扫描、获取控制台输入。
通过new Scanner(Sysem.in)创建一个Scanner,控制台会一直等待输入,直到敲回车结束,把所输入的内容传给Scanner,作为扫描对象。
next() 每次取到一个间隔符前面的数据。
nextInt() 是取next() 然后把字符串解析成一个int数字。
英语:闰年(Leap year)
(2)代码实现
-
import java.util.Scanner;
-
public
class
test {
-
//判断是否为闰年
-
public static boolean isLeapyear(int year){
-
return((year%
4==
0)&&(year%
100!=
0)||(year%
400==
0));
-
}
-
-
//输出具体年份月份的天数
-
public static int days(int year,int month){
-
int day;
-
switch(month){
-
case
1:
-
case
3:
-
case
5:
-
case
7:
-
case
8:
-
case
10:
-
day=
31;
-
break;
-
case
2:day=isLeapyear(year)?
29:
28;
-
break;
-
default:
-
day=
30;
-
break;
-
-
}
-
return day;
-
}
-
-
//程序执行开始
-
public static void main(String[] args){
-
int year,month;
-
Scanner s=
new Scanner(System.
in);
-
System.
out.print(
"请输入年份:");
-
year=s.nextInt();
-
System.
out.print(
"请输入月份:");
-
month=s.nextInt();
-
System.
out.print(year+
"年"+month+
"月的天数是"+(days(year,month)));
-
}
-
}
-
(3)结果展示
-
请输入年份:
2020
-
请输入月份:
4
-
2020年
4月的天数是
30
-
Process finished
with
exit code
0
实例2:找到1000以内所有的素数,并且保存到数组中去
(1)解析
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,质数也称为素数。通过循环遍历2至n/2,若中间的任意一个数能被n整除,则n不是质数,返回false;若所有的数均不能被n整除,则返回true。
英语:素数(prime)
(2)代码实现
-
public
class text1 {
-
//判断给定的数是不是素数
-
public static boolean isprime(int n){
-
int i;
-
for(i=
2;i<=n/
2;i++){
-
if((n%i)==
0){
-
return
false;
-
}
-
}
-
return
true;
-
}
-
-
public static void main(String[] args){
-
int[] primes=
new
int[
1000];
-
int i,count=
0,j;
-
for(i=
2;i<=
1000;i++){
-
if(isprime(i))
-
{
-
primes[count]=i;
-
count++;
-
}
-
}
-
-
for(j=
0;j<count;j++){
-
System.out.println(primes[j]);
-
}
-
-
}
-
}
实例3:实现一个学生类,需要包含姓名、性别、学号和年龄等属性
(1)题目要求
题目:实现一个学生类,需要包含姓名、性别、学号和年龄等属性。要求:
- 无参数和有参数的构造函数
- 各个属性(不包括学号)的set和get方法
- 使用类变量实现学号的自增
- 使用枚举类型表示性别
- 实现toString()方法
- 编写main函数进行测试
(2)代码实现
枚举类型:Gender.java
-
public
enum Gender {
-
MALE,
-
FEMALE
-
}
实现要求:Student.java
-
public
class Student {
-
private String name;
-
private
int no;
-
private
int age;
-
private Gender g;
-
private
static
int count=
0;
-
-
public String getName(){
-
return name;
-
}
-
public String setName(String name){
-
return
this.name=name;
-
}
-
-
public int getAge(){
-
return age;
-
}
-
public int setAgeint (int age){
-
return
this.age=age;
-
}
-
-
public Gender getG(){
-
return g;
-
}
-
public void setG(Gender g){
-
this.g=g;
-
}
-
-
public int getNo(){
-
return no;
-
}
-
-
Student(String name,
int age,Gender g){
-
this.name=name;
-
this.age=age;
-
this.g=g;
-
count++;
-
no=count;
-
}
-
Student(){
-
this(
"",
18,Gender.MALE);
-
}
-
-
public String toString(){
-
return name+
","+g+
","+age+
","+no;
-
}
-
}
测试代码:text.java
-
public
class
text {
-
public static void main(String[] args){
-
Student s1=
new Student(
"zhang san",
20,Gender.MALE);
-
Student s2=
new Student(
"li hong",
21,Gender.FEMALE);
-
Student s3=
new Student(
"wang ming",
23,Gender.MALE);
-
-
System.
out.println(s1);
-
System.
out.println(s2);
-
System.
out.println(s3);
-
}
-
}
运行结果:
-
zhang san,MALE,
20,
1
-
li hong,FEMALE,
21,
2
-
wang ming,MALE,
23,
3
-
-
Process finished
with
exit code
0
实例4:抽象类的继承
(1)题目
题目:抽象类的继承
- 编写抽象类Shape,包含抽象方法void draw()。
- 从类Shape派生两个类Rectangle和Circle。
- 在main函数中分别实例化Rectangle和Circle的对象,赋值给Shape类的引用变量,并调用其draw方法。
(2)实现过程
- 新建一个工程,命名为Shape。
- 在工程中新建一个类,命名为Shape,Shape类为抽象类,包含抽象方法draw,实现代码为:
-
public
abstract
class Shape {
-
abstract void draw();
-
}
- 新建Rectangle类,从Shape类派生并实现抽象方法draw,实现代码为:
-
public
class Rectangle extends Shape {
-
void draw(){
-
System.out.println(
"Draw rectangle.");
-
}
-
}
- 新建Circle类,从Shape类派生并实现抽象方法draw,实现代码为:
-
public
class Circle extends Shape {
-
void draw(){
-
System.out.println(
"Draw circle.");
-
}
-
}
- 新建ShapeTester类,此类是本工程的主类,包含程序入口函数main,实现代码为:
-
public
class ShapeTester {
-
public static void main(String[] args){
-
Shape s=
new Rectangle();
-
s.draw();
-
Shape r=
new Circle();
-
r.draw();
-
}
-
}
(3)结果显示
-
Draw rectangle.
-
Draw circle.
-
-
Process finished
with
exit code
0
转载:https://blog.csdn.net/fanjufei123456/article/details/105504426