美文网首页
java基础1

java基础1

作者: 两分与桥 | 来源:发表于2018-07-14 20:47 被阅读10次

    学习,要阅读别人的源码

    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

          本文链接:https://www.haomeiwen.com/subject/aatupftx.html