java
初步学习(注重与c语言的比较)
关键概念
-
Java是面向对象(OOP:面向对象的编程)的,而c是面向过程的
面向对象易于维护,但性能较面向过程要差一些,面向对象耗费材料
eg.吃饭时面向过程自己买菜做饭,一步一步做出最终的饭菜,做出来因为没有其他原材料没办法更改结果;而面向对象是在餐馆,直接下单要吃的饭菜,就算做好了也可以临时要求老板重做其他饭菜
-
Java的三大特性与五大原则:
- 三大特性:封装(隐藏代码细节),继承(后者的前提),多态
- 五大原则
- 单一职责原则SRP:类的功能要单一
- 开放封闭原则OCP:只接受增加细节,不接受修改
- 里式替换原则LSP:子类能代替父类执行其功能
- 依赖倒置原则DIP:抽象不依赖于具体,具体应依赖于抽象(高级不应该被低级调用,如类不应被对象调用)
- 接口分离原则ISP:不同的接口调不同的功能
-
Java的运行实际上是在JVM(虚拟机)上运行,其跨平台的核心就在于通过不同的虚拟机翻译成不同系统能看懂的语言;
JRE=JVM+核心库类,是Java的运行环境,有了它Java可以运行但不能开发
JDK=JRE+运行开发工具,一般初学直接下载JDK即可
基础
第一个Java程序:
public class HelloWorld{
public static void main(String[] args){
System.out.print("HelloWorld");
}
}
//class 后面的 称之为“类名”
//public class后面的类名 必须和文件名保持一致
//一个文件可以多个类(class),但是只能有一个 公共类(public class)
-
Java的输出与输入
-
输出:调用System类里的方法
System.out.print()
,若是println
则自动换行; -
输入:(1)实例化Scanner类
Scanner input = new Scanner(System.in);
(2)以input引用类的方法input.nextInt()/nextLine()
等等,input.equals("需要比较的字符串")
可以将读入与预期进行比较,一样则返回1(任意一个字符串都有该种方法)`next()` 和`nextLine()`的区别: next()不接收空格、回车,并且将空格、回车作为终止符号 nextLine()接收空格、回车
-
-
运算符:
>>>
无符号右移:无论最高位是0还是1,空缺位都用0填充 -
基本数据类型:
-
定义
long
类型时需要给数据加上L或l
,同理float
要加F或f
,而double
要加D或d
,long
和double
都是八个字节,没有long long
-
boolean
是布尔类型 -
Java里
char
关键字占两个字节,byte
作为单独一个关键字占一个字节,且没有sizeof
这样的关键字,但可以调用类里面的常量得知其字长,需要注意char
没有提供这种常量
-
public class test {
public static void main(String[] args) {
System.out.println(Integer.SIZE);//32
System.out.println(Integer.BYTES);//4
}
}
-
final
代替const
的功能,Java里无const
-
进制表示:二进制 :0b+数字(eg.0b011表示3);十进制(默认);八进制: 0+数字;十六进制:0x+数字
-
产生随机数
Math.random()
循环语句
foreach
(增强for)可用于遍历数组和集合
数组例子:(自动打印完numbers
里面的数据)
public class test {
public static void main(String[] args) {
int [] numbers = {10, 20, 30, 40, 50};
for (int tep : numbers) {//tep的类型应与numbers的类型保持一致
//若在该处对tep赋值,则无法输出数组内的元素
System.out.println(tep);
}
}
}
数组
需要注意的小细节
两种创建新数组形式:
int [] students = new int[300];//只声明数量不赋值
int students[] = new int[300];//与上一行等价
int[] students = new int[]{97,98,99};//直接初始化
int[] students = {97,98,99};//对上一行的简化
可以这样分开创建与赋值:
int[] test = new int[3];
test = new int[]{0, 1, 2};
排序的库方法:
Arrays.sort(students);
字符串数组:
String[] province = {"陕西", "山西", "四川"};
- 获取数组长度时使用其属性
students.length
探寻数组的一个小测试
笔者想试一试int
数组能不能像字符串那样直接打印出全部值
int[] test = new int[30];
test = new int[]{10, 20, 30};
System.out.println(test);
//打印的结果为[I@776ec8df
看着像地址实则不然,Java是一个面向对象的语言,会隐藏底层实现,几乎所有直接寻址都是无果的
直接打印数组名,数组对象会调用其默认的toString
方法(Java里的强制转化,这里是转化为String
字符串类输出)。对于数组类型,这个默认的toString
方法并不会返回数组内容的字符串表示,而是返回数组的类型信息和一个哈希码(由地址算出)的十六进制表示
但我们如果主动使用这个方法,则会打印出数组内的值
System.out.println(Arrays.toString(test));
//打印的结果为[10, 20, 30]
类与对象
-
类是抽象的,对象是具体的(eg.对象“张三”“李四”属于“人”这个类)
-
类由静态的属性和动态的方法组成
-
属性(独有):可以类比c语言中的全局变量,位于方法外面类的里面,会自动进行初始化,
int
默认为0
,String
默认为NULL
-
方法(公共):可以理解为函数,同一个类下的方法间也可以互相调用
public class Person { int age; String name; //Person类的属性 public static void Eat{ System.out.println("吃饭"); } public void Sleep{ System.out.println("睡觉"); } //Person类的方法 }
方法的调用与
static
修饰间的关系:(不调同级别的不礼貌)static方法是类级别的,非static方法则是对象级别的
同一个类中:
-
都有static ,或都没有static可直接调用
-
有static的方法不能直接调用没有static的方法(类不能直接调对象,需要实例化)
不同类中:
- 万能方法:引用实例化(可以调所有,将在下面介绍)
- 直接使用
类名.方法()
其中的方法必须是static修饰(类可以直接调类)
-
-
-
在其他类中要使用类的属性和方法需要将类实例化为具体的对象
假设下面在
main
里面调用Person
类
public class Study {
public void main(String[] args) {
Person zhangsan = new Person();//实例化:类名 引用名 = new 类名();
zhangsan.age = 18;
zhangsan. name = "张三";
zhangsan.Sleep();
zhangsan.Eat();//极其不推荐,违背了依赖倒置原则,对象级别的zhangsan直接调用了类级别的static
//具体调用Person类中的属性和方法时需要用" . ",
}
}
在上面的例子中,zhangsan
就是一个对新对象new Person()
的一个引用,当然也可以将zhangsan
理解为具体的对象,毕竟Java中一切皆对象
zhangsan
这个引用实际上是在栈区,内部保存着新对象的内存地址,而实例化后的对象new Person()
则在堆区
Java中没有指针,但实际上这个引用就起着指针的作用