java基础

Java入门与环境搭建

1. java语言分类:j2se,j2me,j2ee

j2me->安卓

2. Java跨平台性

一次编译,处处运行。因为每个操作系统都有jvm,平衡了操作之间的差异,可以运行.class文件

垃圾回收

3. 程序员无法精确控制和干预

4. Jdk和jre

Jdk:Java开发工具包

Jre:Java运行环境

Jdk中包含jre。Jdk中bin文件夹下都是java命令,例如javac,java命令

5. 程序安装

建议安装目录不要有中文,空格,特殊字符(@,$),原因是当读文件的时候可能会发生转义找不到文件。例如空格会转义成

6. java环境变量的配置

JAVA_HOME,PATH

JAVA_HOME是java安装路径

PATH %JAVA_HOME%\bin

Path这样做的好处是,万一JAVA_HOME路径发生改变,

JAVA_HOME不是必须配置的。在web时,会用到这个变量

 

上面的环境变量是针对某一用户的,下面的环境变量是针对系统的,系统有多少用户都可以使用

7. Java开发步骤

a) 编写.java文件

b) 把.

c) 运行.class文件java +文件名(不带后缀)

 

 

变量与运算符

1. 合法标识符规则

由26个英文字母大小写,数字:0-9 ,_或 $ 组成  

数字不可以开头。

不可以使用关键字和保留字,但能包含关键字和保留字。

Java中严格区分大小写,长度无限制。

标识符不能包含空格

2. Java中的名称命名规范

包名:多单词组成时所有字母都小写:xxxyyyzzz

com.hp.onlinexam.login.dao

类名接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

ITeacherDao,CharacterEncodingFilter

变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

int id,String name

3. 变量分类

成员变量,局部变量

4. 数据类型

基本数据类型(8种)和引用数据类型(3种)

Byte short int long float double char blooen

数组 类 接口

基本数据类型由小到大记

数据类型转换,有小到大自动转,由大到小需强制

Boolean不能和其他转换

当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型

5. 运算符

/:取整

%:取余

++,--运算

=和==区别

&&和||

三元运算符

 

 

 

顺序结构及条件结构

1. Scanner类

Scanner sc = new Scanner(System.in);

数据类型(引用数据类型,类类型) 变量名 = new +类名(System.in);

sc.nextInt()可以从控制台接收一个int类型的变量

sc.nextLine()可以从控制台接收一个String类型的变量

2. 类的完整的名称:包名+类名

为什么要使用包(package)?

防止有重名的类

方便类的管理

3. If语句 

If可以没有else

If…else if…else,else if可以有多个else if后可以跟表达式

 

 

If或者else中,如果只有一句,{}可以省略

If..else语句可以嵌套

4. Switch语句:

a) switch里的表达式和case后的变量做比较,如果没找到合适的值,执行default语句

b) 2.找到合适的值,执行值对应的代码块。如果有break,则跳出。如果没有,继续往后执行

c) break不是必须的,案例见SwitchScore.java

d) switch表达式支持的数据类型:int, byte, char, short, 枚举, 字符串String

 

 

 

Day4 while do while

1. If(布尔类型表达式)语句else if(布尔类型表达式),boolean类型的表达式:

if(true)—一般表达式不会直接写true,false,而是一个变量,或者通过比较运算符组成的条件,eg:a>0或者多个比较运算符组成的条件:eg:a>=0 && a<=100

while(布尔类型表达式):while的表达式可以用true

switch(表达式):byte,short,int,char,enum,String

2. 运行方式

如果是web项目,运行方式是run/debug on server

如果一个类带有main方法,是可以使用java application运行的

Run/debug:run可以直接运行出结果,debug可以关注中间过程。

如果想关注代码的中间过程,例如某一行代码的变量的内容,在这行左侧蓝色区域双击,会出现一个“点”,叫断点。有了断点后,可以用debug->java application运行代码。入口是main方法,从main方法开始执行,一直运行到打断点的行暂定。你可以观察中间过程,按F6,按行执行代码。按F8,跳转到下一个断点。如果想让程序一直执行到结束,可以双击断点,把断点去掉。按F8,直到程序结束。

 

点击java,回到java透视图

 

 

 

For循环

1. for (初始表达式; 条件表达式; 迭代表达式)

{

循环语句;

}

表达式如果不满足条件表达式,无法进入循环eg:for(int i=0;i>100;)

死循环eg:for(int i=0;i<10;i--),for(int I =9;i>0;i++)

迭代表达式在循环语句执行完毕后,对迭代的值修正

2. While,do while for适用场景

While适用于迭代次数不固定的场景

Do..while,后要有分号,先做一次循环,然后判断条件是否成立

For循环,适用于迭代次数固定的场景

3. Break和continue区别

Break:用于switch语句时,跳出分支语句。循环语句的时候用于跳出循环

Continue只能用于循环语句跳出本次循环

 

 

 

类和对象

1. 成员变量 vs 局部变量

相同点:

a) 遵循变量声明或定义的格式: 数据类型 变量名 = 初始化值

成员变量,可以不初始化。如果不初始化,当创建对象的时候系统初始化。

局部变量必须显示的初始化

b) 都有作用域

成员变量作用域是类

局部变量作用域是方法

出了作用域,无法使用

不同点:

1. 声明的位置的不同 :

成员变量:声明在类里,方法外

局部变量:声明在方法内,方法的形参部分,代码块内

2. 成员变量的修饰符有四个:public private protected 缺省(default)

局部变量没有访问修饰符

Private类型成员变量,在本类中可以访问

当brand改为public权限,可以访问

2. 类的结构

[< 修饰符>] class < 类名> 

{

    [<属性>]

    [<构造构造方法>]

[<方法>]

[]表示可选

成员变量:

[<修饰符>]  类型  <属性名> [=初值] ; 

变量必须先定义后使用

成员变量在对象创建的时候由系统初始化

方法:

<修饰符> <返回类型> <方法名>([< 参数表>]) {

    [< 语句>]

public class Person {

private String name;

// age保存的年龄

private int age;

private int sex;

 

public void study() {

System.out.println("studying");

}

}

3. 对象的创建:

使用构造方法创建:类型(类名) 对象名 = new 类名()

通过对象调用成员变量或方法

对象成员变量有什么用?记录对象成员变量的信息,不同对象表现不同。

P1.name=”张三” p2.name=”李四”

Car1.color=”red”,car2.color=”blue”

4. 参数传递

基本类型传值,对象类型传地址 

 

 

 

 

Day7封装

1. 封装的好处:

1) 隐藏对象的成员变量

2) 成员变量的访问,通过get/set方法访问

3) 读写可分离,通过设置访问权限

4) 隐藏具体的实现细节

2. Get/set方法命名规范

get/set+成员变量

方法名符合命名规范

public int getAge(){

return age;

}

public void setAge(int param)

。。

}

3. 类中成员变量访问权限一般设置成private,通过get,set方法访问

4. 构造方法

生成对象,new+构造方法

初始化成员变量

构造方法名和类名相同,无返回值(对比普通方法定义)

public class Person2 {

public Person2(){

}

}

如果类中没有定义构造方法,系统提供无参的构造方法。如果定义了,都不提供

Person2 p = new Person2();

Date d = new Date();

5. 构造方法重载

方法名相同,参数列表(参数个数,参数类型)不同

public Person2(){

}

public Person2(String name, int age){

}

6. 构造方法初始化成员变量

可以使用this.成员变量名来访问。如果成员变量名和构造方法形参名一样,必须使用this.成员变量名访问

public Person3(String name, int age){

this.name = name;

this.age = age;

}

7. 构造方法之间的调用

类有多个成员变量,,构造方法有重载。参数多的构造方法可以调用参数少的构造方法。可以使用this关键字调用参数少的方法。可以传参。This必须写在第一行

public Person3(String name, int age){

this.name = name;

this.age = age;

}

 

public Person3(String name, int age, String sex, String home){

this(name,age);

this.sex = sex;

this.home = home;

}

 

 

Day9多态

1. 多态

表现:重载,重写

优点:重载:同一个名字多个方法可以使用。不用再起另外的名字

重写:子类对象可以表现为不同于父类的行为。通过声明为父类,定义为子类,少写很多代码

2. 重载

在同一类中。在不同类中方法名相同,参数列表不同不构成方法重载 方法名相同 参数列表不同:参数个数,参数类型不同

系统会根据参数个数和类型自动匹配应该调用哪个方法

只根据方法的返回值,无法判断方法重载

因为方法虽然有返回值,但是可以不接收

java无法判断改掉用哪个方法

public int add(int i, int j) {

return i + j;

}

public double add(double i, double j) {

return i + j;

}

public int add(int i, int j, int k) {

return i + j + k;

}

3. 重写

重写:父类方法满足不了子类要求

返回类型相同

方法名相同

参数列表相同

访问权限:不小于父类方法

父类是default,子类可以是protected,public

public class Person {

private String name;

private int age;

public String getInfo() {

return "Name: " + name + "\n" + "age: " + age;

}

}

public class Student extends Person{

private String school;

public String getInfo(){

return "Name: " + getName() + "\n" + "age: " + getAge()+"\nschool:"+school;

}

public static void main(String [] args){

//当创建的是子类对象时,调用的是子类的方法

Student s = new Student();

System.out.println("创建子类对象:"+s.getInfo());

//当创建的是父类对象的时候,调用的是父类的方法

Person p = new Person();

System.out.println("创建父类对象:"+p.getInfo());

Person p2 = new Student();

System.out.println("调用的是哪个对象的方法:"+p2.getInfo());

}

}

4. 重载和重写

重载针对同一个类中不同的方法,方法名相同,参数列表不同

重写:父类的方法满足不了子类要求,子类重写父类的方法,方法名,参数列表,返回类型都相同

5. Final关键字

1) Final修饰的类不能被继承,例如String

2) Final修饰的方法不能被重写:

public class Person {

public final String getInfo(){};

}

public class Student extends Person{

//报错

public String getInfo(){

}

}

3) Final修饰的基本数据类型变量,初始化不能被修改

public class FinalVariableTest {

//final修饰的基本数据类型变量,初始化后不能被修改

final int aa = 5;

public void change(){

// aa = 10;

}

}

4) Final修饰引用数据类型变量,地址不能被修改,即不能把一个其他变量赋值给它。

public void tune(final Instrument in){

// in = new Instrument();形参是final类型,不能改变地址

in.setNote("music3");

in.play("music");

}

 

6. Static类型关键字

可以修饰变量,也可修饰方法

Static修饰变量,成为类变量。类变量中所有对象共享一套数据,类名.静态变量名

Static修饰方法:所有对象共享,类名.静态方法

在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。

静态方法不能以任何方式引用this关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。

main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员。

随着类的加载而加载,只加载一次

类属性作为该类各个对象之间共享的变量。

 

 

 

 

Day10 抽象类和接口

1. 抽象类

类可以定义为抽象类

有抽象方法的类都是抽象类

抽象方法应用场景:

1) 方法的实现没想好

2) 无法统一子类的实现

如果父类中有抽象方法,子类不实现,子类必须为抽象类

抽象类不能被实例化

2. 抽象类不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法

1) 属性:Abstract只能修饰类,方法。属性(成员变量)都有具体的值。

2) 私有方法:如果能修饰,子类可以实现私有方法。私有方法只有本类能访问到,子类没有访问权限,既然不能访问就不能实现,子类必须定义为抽象类,子类继承类也必须是抽象类。子类中没有类能定义为非抽象类,无法用构造方法创建对象。

3) 构造方法:构造方法特点:和本类类名相同。构造方法在子类中不能被重写。如果能够修饰构造方法,构造方法在父类中只有声明,需要在子类中重写。所有不能修饰,矛盾

4) 静态方法:静态方法调用规则:类名.静态方法。如果能修饰,静态方法只能声明,不能有实现。矛盾

5) Final:final修饰的方法,不能被重写。如果用abstract修饰,目的是让子类实现这个方法。又不能被重写,又要求实现,矛盾

3. 接口应用场景:

1) 无法统一实现,即使实现了意义也不大

2) 软件实现流程,详细设计阶段。统一类功能,方法名,返回,参数等信息

4. 接口的特点:

1) 用 interface 来定义。

2) 接口中的所有成员变量都默认是由public static final修饰的。

3) 接口中的所有方法都默认是由public abstract修饰的。

4) 接口没有构造方法。

5) 实现接口的类必须提供接口中所有方法的具体实现内容。 

5. 抽象类VS接口

相同点:

i. 接口和抽象类都不能被实例化。只能被其他类实现和继承。

ii. 接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类。

不同点:

iii. 抽象类与接口定义不同:抽象类abstract class ,接口  interface

iv. 接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。

v. 接口里不能定义静态方法;抽象类可以定义静态方法

vi. 接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量

vii. 接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。

viii. 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java的单继承不足

 

 

 

 

 

 

Day11数组

1. 数组

什么是数组

数组是存储同一数据类型多个元素的集合,int a[],Person [] p

数组适用场景

集合,更适用于容器大小固定

不适用于对元素的增加,删除

数组一旦初始化,长度不可变

2. 一维数组声明

int a[];

int[] a1;

double  b[];

Date[]c;

3. 数组初始化

 动态初始化:数据类型[] 数组名 = new 数据类型[数组长度];

 静态初始化:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};,可以简写为:数据类型[] 数组名 ={元素1,元素2,…}

 每个数组都有一个属性 length 指明它的长度

 数组元素的引用方式:数组名[数组元素下标]

 数组元素下标可以是整型常量或整型表达式

 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 至 n-1

4. 数组的异常信息:

 ArrayIndexOutOfBoundsException

 NullPointerException

5. 数组的应用

遍历,赋值,冒泡排序,传值和传址

6. 二维数组

一维数组中每个元素又都是数组

二维数组访问,遍历,赋值

 

 

 

常用类

1. Object类

所有类的父类。Equals,toString方法默认实现。如果不满足子类需求,可以重写(多态)。

==和equals区别

 

2. String类

String不可变字符串。subString,trim,length,split

3. StringBuffer

可变字符串。字符串拼接频繁,次数较多。

Append

4. 包装类

基本数据类型,只有int和char包装类特殊。

Integer.parseInt()把字符串转换成int类型

String.valueof()把数值型转换成String类型

5. Date & DateFormat 类

Date date = new Date();

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

System.out.println("使用sdf格式化:"+sdf.format(date));

 

 

Day16反射

1. 反射有什么好处 应用场景

动态编译,需要什么加载什么

只要知道类名,通过反射能知道类的所有内容。在修改成员变量值时,可以和业务无关

例如:Student,知道成员变量,set方法修改成员变量的值

通过反射,只要知道类名即可知道类的相关信息,通过某种方式set值即可

2. 反射

操作类Class.forName(),数据库驱动加载

反射操作构造方法:

无参:获取类.newInstance

有参:获取构造方法 构造方法.newInstance

操作属性:获取类.getDeclaredField()

操作方法:类.getDeclaredMethod,method.invoke

Class c1 = Class.forName(“”);

  () p = c1.newInstance();

Method m1 = c1.get(“”,返回类型.class)

M1.invoke(p,chuzhi)

Sysout(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值