java基础1

学习,要阅读别人的源码

java入门

算法是计算机的灵魂,编程语言是塑造计算机灵魂的工具,核心是算法
java广泛应用于企业级软件开发,安卓移动开发,大数据云计算等领域,几乎涉及IT所有行业    

java 发展简史

java核心优势----->跨平台/可移植性,例如Java的int永远都是32位
    第一大语言,安全性,跨平台,面向对象,简单性,高性能,分布式,多线程,健壮性

java三大版本

JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用
JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用
JavaMe(Java Micro Edition):微型版,定位在消费性电子产品的应用上

计算机高级语言的类型主要有编译型和解释型,而java语言是两种类型的结合。

Java首先利用文本编辑器编写Java源程序,源文件的后缀名为.java,
再利用编译器(javac)将程序编译成字节码文件,字节码文件的后缀名为.class,
最后用虚拟机(解释器,java)解释执行

JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的'虚拟计算机'。
JRE(Java Runtime Environment)包含:Java虚拟机,库函数,运行Java应用程序所必须的文件。
JDK(Java Development Kit)包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件。

JDK的安装,环境变量的配置,测试JDK是否安装成功命令行执行:java -version

错误就是提高的机会!解决的错误越多,提高得越快,能力越强

Java对大小写敏感,public是访问修饰符,class是类

一个源文件可以包含多个类,但一个源文件中至多只能声明一个public类

以分号结束

标识符的使用规范

表示类名的标识符

每个单词的首字母大写,如Man, GoodMan

表示方法和变量的标识符

第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()

java是强类型语言,每个变量都必须声明其数据类型

局部变量:
    方法或语句块内部定义的变量,定义变量后必须初始化才能使用
成员变量,也叫实例变量 member variable
    方法外部、类的内部定义的变量,从属于对象,生命周期伴随对象始终。
    如果不自行初始化,它会自动初始化成该类型的默认初始值。
    int-->0;double-->0.0,char-->'\u0000',boolean-->false
静态变量,类变量static variable
使用static定义,从属于类,生命周期伴随类始终,从类加载到卸载

常量(Constant),大写
    利用关键字final来定义一个常量,常量一旦初始化后不能改变其值

java中float比较不精确,浮点类型默认是double

char是字符,String是字符串

boolean类型有两个常量值,true和false,在内存中占一位,不是一个字节

取模运算,余数符号和左边操作数相同

单引号是char,双引号是string

方法的调用方式

形参,实参,返回值(事先约定返回值的数据类型,如无返回值,必须显示指定为void)

return 两个作用:1.结束方法的运行 2.返回值

传递参数,遵循值传递的原则(传递的都是数据的副本)

java 中存在重载

方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。
调用时,会根据不同的参数自动匹配对应的方法。

重载的方法,实际是完全不同的方法,只是名称相同而已!

构成方法重载的条件:
      1.不同的含义:形参类型、形参个数、形参顺序不同
      2.只有返回值不同不构成方法的重载

面向过程和面向对象

面向对象具有三大特征:封装性、继承性和多态性,

相辅相成的关系
    面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以
    不同的方式去分析、设计和开发软件

类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。

static修饰的方法,可以直接调用

package pro01;

public class BallGame{
    public static void main(String[] args) {
        int a =30;
        int b = 50;
        int c = Test(a,b);  -- 直接调用
        System.out.printf("结果是 %d+%d=%d",a,b,c);
    }
    static int Test(int a,int b) {  -- static 可以直接调用,不必实例化对象
        System.out.println("aaa");
        return a+b;
    }
}

属性fields或者称为成员变量,在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。

基本的类

package pro01;

public class Student {
    
    -- 属性fields
    int id;
    String name;
    int age;
    
    -- 方法
    void study() {
        System.out.println("study!!!");
    }
    void play() {
        System.out.println("play!!!");
    }
    
    -- 程序执行的入口,必须要有
    public static void main(String[] args) {
        Student s = new Student(); -- 实例化类,生成对象
        s.play();
    }
    * 构造方法,用于创建这个类的对象,如果没有自行提供构造方法,则系统会自动创建无参的构造方法。
    * Student(){
    * }
}

调用外部的类

package pro01;

public class Student {
    
    //属性fields
    int id;
    String name;
    int age;
    Computer comp;
    
    //方法
    void study() {
        System.out.println("study!!!");
    }
    void play() {
        System.out.println("play!!!"+comp.brand);
    }
    
    //程序执行的入口,必须要有
    public static void main(String[] args) {
        Student s = new Student(); //实例化类,生成对象
        s.name = "张三";
        Computer comp1 = new Computer();
        comp1.brand = "华硕";
        s.comp = comp1;
        s.play();
    }
}

class Computer{
    String brand;
}

打印:
play!!!华硕

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area

栈的特点如下:

1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3.栈属于线程私有,不能实现线程间的共享!
4.栈的存储特性是"先进后出,后进先出"
5.栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆的特点如下:

1.堆用于存储创建好的对象和数组(数组也是对象)
2.JVM只有一个堆,被所有的线程共享
3.堆是一个不连续的内存空间,分配灵活,速度慢!

方法区(又叫静态区)特点如下:

1.JVM只有一个方法区,与所有线程共享!
2.方法区实际也是堆,只是用于存储类、常量相关的信息!
3.用来存放程序中永远是不变或唯一的内容。(类信息[Calss对象]、静态变量、字符串常量等)

Java中""中存放的是字符串常量

构造器也叫构造方法(constructor),用于对象的初始化。

1. 通过new关键字调用!!
2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!
4. 构造器的方法名必须和类名一致!

Java中引入了垃圾回收机制,垃圾回收过程

1. 发现无用的对象
2. 回收无用对象占用的内存空间。
分代垃圾回收机制

this 指代当前对象

this最常的用法:
1. 在程序中产生二义性之处,应使用this来指明当前对象;
  普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须
  位于构造方法的第一句。
3. this不能用于static方法中,(static中没有this)

对象创建的过程和this的本质

在类中,用static声明的成员变量为静态成员变量,也称为类变量。
类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:

1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。

2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!

3. 一般用“类名.类属性/方法”来调用,也可以通过对象引用或类名(不需要实例化)访问静态成员。

4. 在static方法中不可直接访问非static的成员,static修饰的成员变量和方法,从属于类。
  普通变量和方法从属于对象的。

Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。而引用类型指的是“对象的地址”。

java中的包

1. Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用
2. 如果导入两个同名的类,只能用包名+类名来显式调用相关类

静态导入

import static java.lang.Math.*;
import static java.lang.Math.PI;

方法的重写override

子类通过重写父类的方法,可以用自身的行为替换父类的行为

== 与 equals

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等,即是同一个对象。

Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true,否则返回 false。

但是,我们可以根据我们自己的要求重写equals方法。

属性/方法查找顺序:(比如:查找变量h)

1. 查找当前类中有没有属性h
2. 依次上溯每个父类,查看每个父类中是否有h,直到Object
3. 如果没找到,则出现编译错误。
4. 上面步骤,只要找到h变量,则这个过程终止。

构造方法调用顺序:

构造方法默认第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:
先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止

注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复

封装:提高代码的安全性,提高代码的复用性,高内聚,低耦合

各种属性: public, protecte, default, private
用private设置私有属性,只能在类中访问

package pro01;

class Test{
    private String name;
    private int age;
    private boolean flag;
    
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        if(age>0 && age<120) {
            this.age = age;
        }else {
            System.out.println("this age [" + age + "] not is a valid age!!");
        }
    }
    public int getAge() {
        return age;
    }
}

public class Home{
    public static void main(String[] args) {
        Test t = new Test();
        t.setName("libai");
        System.out.println(t.getName());
        t.setAge(130);
        System.out.println(t.getAge());
        t.setAge(55);
        System.out.println(t.getAge());
    }
}

java的多态(polymorphism)

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
继承,方法重写,父类引用指向子类对象。

package pro01;

class Animal{
    public void Shout() {
        System.out.println("call something");
    }
}

class Dog extends Animal{
    public void Shout() {
        System.out.println("dog call");
    }
}

class Cat extends Animal{
    public void Shout() {
        System.out.println("cat call");
    }
}

public class Home{
    public static void main(String[] args) {
        
        Animal a = new Animal();
        CallShout(a);
        CallShout(new Dog());
    }
    static void CallShout(Animal animal) {  -- 这里就体现了多态的作用
        animal.Shout();      -- 只需要用一个Animal就可以代替Dog和Cat类的对象
    }
}

对象的转型(casting)

final关键字的作用

1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
2. 修饰方法:该方法不可被子类重写。但是可以被重载!
3. 修饰类: 修饰的类不能被继承。比如:Math、String等。

Java中的数组

数组就是对象(存储在堆中)
数组是相同类型数据的有序集合,注意是相同类型,与python不同

1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
2. 其元素必须是相同类型,不允许出现混合类型。
3. 数组类型可以是任何数据类型,包括基本类型和引用类型。

声明一个数组的时候并没有真正创建,只有实例化数组对象时,JVM才分配空间。

创建方式

type[] arr_name; //(推荐使用这种方式)

遍历数组,for,for-each

package pro01;

public class Home{
    public static void main(String[] args) {
        int[] arr = null;
        arr = new int[4];
        
        -- 初始化元素的值
        for(int i=0;i<4;i++) {
            arr[i] = 10*i;
        }
        -- 读取元素的值
        for(int i=0;i<4;i++) {
            System.out.println(arr[i]);
        }
        -- for-each循环用于读取数组元素的值,不能修改元素的值
        for(int m:arr){
            System.out.println(m);
        }
    }
}

抽象类

通过抽象类,可以避免子类设计的随意性。

1. 有抽象方法的类只能定义成抽象类
2. 抽象类不能实例化,即不能用new来实例化抽象类。
3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
4. 抽象类只能用来被继承。
5. 抽象方法必须被子类实现。
package com.ss;

public abstract class Animal {
    public abstract void run();  -- 子类必须重写父类的run方法
}

class Dog extends Animal {
    @Override
    public void run() {
        System.out.println("must to override run");
    }
}

接口interface,接口支持多继承

package com.ss;

public interface Animal {
    -- 接口中只有:常量,抽象方法
    -- public static final 接口中常量定义时,写或不写都是这样
    String name = null;
    -- public abstract 定义方法中也是默认这两个类型
    public void testA();
    public void testB();
}

class Dog implements Animal{
    public void testA() {}

    public void testB() {}
}

你可能感兴趣的:(java基础1)