疯狂Java讲义

(2017.09.24)
    1.JDK包含了运行Java程序的JRE,所以无需安装公共JRE;公共JRE是一个独立的JRE系统,会单独安装在系统的其他卢金霞,公共JRE会向IE浏览器和系统中注册Java运行时环境,通过这种方式,系统中任何程序都可以使用公共JRE。
    2.设置PATH变量:"用户变量"--"PATH"用于设置当前用户的环境变量;"系统变量"--"Path"用于设置整个系统的环境变量。如果同时存在系统变量优先于用户变量。

(2018.02.08)
    1.Windows操作系统根据Path环境变量来查找命令。Path环境变量的值则是一系列路径,Windows操作系统将在这一系列路径中依次查找命令,如果能找到这个命令,则该命令是可行的,否则将出现"'xxx'不是内部或外部命令,也不是可运行的程序或批处理文件"的提示。Linux操作系统则根据PATH环境变量来查找命令,PATH环境变量也是一系列路径。
    2.编译java程序:javac -d srcFile;   运行java程序:java Java类名
    3.CLASSPATH环境变量的作用是 当使用"java Java类名"时,指定JRE到某路径搜索java类。即指定搜索路径。1.5版本之前都需要设置。
    4.Java虚拟机从main方法开始解释执行。
    5.面向对象的三个基本特征:封装、继承、多态
    封装 是指将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能(访问控制符来实现);
    继承 是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法。
    多态 指的是子类对象可以直接付给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
    6.编程的本质就是对内存中数据的访问和修改。
    7.java类型分为两类:基本类型和引用类型。引用类型包括类、接口、数组类型。所谓应用数据类型就是对一个对象的引用,对象包括实例和数组两种。

(2018.02.09)
    1.字符集就是所有字符的编号组成总和。
    2.表达式类型自动提升:整个表达式的数据类型自动提升到与表达式中最高等级操作数相同的类型。
    3.两个整数相除,得到结果是把小数截取后的整数。
    4.+与字符串运算,得到的是字符串
    5.逻辑运算符:短路 && ||

(2018.02.10)
    1.java的数组类型是一种引用类型的变量。
    2.switch语句后面的控制表达式的数据类型只能是byte、short、char、int四种整数类型。Java 7后支持枚举 和 String

(2018.02.23)
    1.Java 8 增强工具类 Arrays 包含static方法可直接操作数组。
    2.System中arraycopy(...)方法也可以复制数组
    3.static的真正作用就是用于区分成员变量、方法、内部类、初始化块这四种成员到底属于类本身还是实例。
    4.创建对象的 根本途径 是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。
    5.Person p = new Person();生成了p变量和Person对象,p变量存放在栈内存中,指向实际的Person对象;真正的Person对象放在堆内存中。
    6.Java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。
    7.this关键字总是指向调用该方法的对象。
    8.由于static修饰的方法不能使用this引用,所以static修饰的方法不能访问不适用static修饰的普通成员,因此Java语法规定:静态成员不能直接访问非静态成员。
    9.Java里方法的参数传递方式只有一种: 值传递 。所谓值传递,就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响。
    10.递归(一个方法体内调用它自身)一定要向已知方向递归。即要有出口,不然就变成死循环了。
    11. (overload)方法重载 :同一个类中方法名相同,参数列表不同。与返回值类型、修饰符无关。
    12.成员变量无需显示初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。
    13.成员变量是存储在对内存中的。它的作用于将扩大到类存在的范围或者对象存在的范围。
    14.局部变量除了形参外(方法局部变量、代码块局部变量)都必须显示初始化,必须献给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。
    15.局部变量不属于任何类或实例,它总是保存在其所在方法的栈内存中,栈内存中的变量无需系统垃圾回收,往往随方法或代码块的运行结束而结束。
    16.过度使用成员变量将有两个害处:a.增加变量的生存时间,这将导致更大的内存开销;b.扩大了变量的作用域,不利于提高程序的内聚。
    17.访问控制符
           private       --       default        --         protected           --  public 
        (当前类的内部)       (相同包下的其他类访问 )       (同一包其他类,不同包子类)       (全局范围 )
    18.高内聚:尽可能把模块的内部数据、功能实现细节隐藏在模块内部独立完成,不允许外部直接干预;
    19.低耦合:仅暴露少量的方法给外部使用。
    20.java包机制需要两个方面的保证:a.源文件使用package语句指定包名;b.class文件必须放在对应的路径下。

(2018.02.24)
    1.使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。
    2.Java子类不能继承父类的构造器。
    3.java.lang.Object是所有类的父类。
    4. (override)方法重写 (方法覆盖):子类包含与父类同名方法的现象被称为方法重写。遵循"两同两小一大","两同"--方法名相同,形参列表相同;"两小"--子类方法返回值类型、抛出的异常类应比父类方法的返回值或抛出的异常类更小或相等;"一大"--子类方法的访问权限应比父类方法的访问权限更大或相等。PS:要么都是类方法,要么都是实例方法。
    5.可以使用super关键字或父类类名作为调用者来调用父类中被覆盖的方法。但若父类的方法具有private访问权限,则方法是对子类隐藏的,子类无法访问,也不可重写。若子类出现相同的方法,属于新方法,不属于重写的范畴。PS:super用于限定对象调用它从父类继承得到的实例变量或方法。
    6.不管是否使用super低啊用来执行父类构造器的初始化代码,子类构造器总会调用父类构造器一次。
    7.创建任何对象总是从该类所在的继承树最顶层类的构造器开始执行,然后一次向下执行,最后才执行本类的构造器。
    8. 多态 :Java引用变量有两个类型:编译时类型,运行时类型;编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现多态(Polymorphism)。
    9.多态情况下:变量--编译和运行时都看左边;方法--编译看左边,运行看右边。
    10.子类是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无需任何类型转换,或者被称为向上转型,向上转型由系统自动完成。
    11.强制转换,将一个引用类型变量装换成子类类型。即引用类型之间的强制转换必须具有继承关系。PS:强制转换之前可以用instanceof来判断。
    12.instanceof运算符前一个操作数是一个引用类型变量,后一个操作数是一个类或接口,用于判断前面的对象是否是后面类,或者其子类、实现类的实例。
    13.组合就是把旧类对象最为新类的成员变量组合进来。
    14.当java创建一个对象时,系统先为该对象的所有实例变量分配内存(前提该类已经被加载过了),接着程序开始对这些实例变量执行初始化,初始化顺序是:先执行初始化块或声明实例变量时指定的初始值(这两个顺序允许与排序顺序相同),在执行构造器里指定的初始值。PS:实际上执行javac编译命令后,初始块中的代码会被"还原"到每个构造器中,且位于构造器所有代码的前面。
    15.静态初始化块总是比普通初始化块先执行。
Root静态初始化块
Mid静态初始化块
Leaf静态初始化块
Root普通初始化块
Root的无参数构造器
Mid普通初始化块
Mid的无参数构造器
Mid的带参数构造器,参数值:疯狂Java讲义
Leaf普通初始化块
Leaf的无参数构造器
Root普通初始化块
Root的无参数构造器
Mid普通初始化块
Mid的无参数构造器
Mid的带参数构造器,参数值:疯狂Java讲义
Leaf普通初始化块
Leaf的无参数构造器
    16.常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据,它包括了关于类、方法、接口中的常量,还包括字符串常量。

(2018.02.25)
    1.final修饰符
a.final修饰的成员变量必须由程序员显示的指定初始值。系统不会对final成员进行隐式初始化。
b.final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次不能重复赋值。
c.final修饰基本类型变量时,基本类型变量不能被改变;修饰引用变量时,引用变量所引用的地址不能被改变,即一直引用一个对象,但这个对象的可以发生改变。
d.final -- 宏变量,定义final变量时就为该变量指定初始值,该初始值可以再编译期间确定下来,final变量本质上就是一个"宏变量",编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
e.对于final实例变量而言,只有在定义该变量时指定初始值才会有"宏变量"的效果

f.final修饰的方法不可被重写。
g.final修饰的类不可以有子类。

    2.不可变类:创建该类的实例后,该实例的实例变量时不可改变的。如果设计一个不可变类,要注意引用类型的成员变量,如果该变量时可变的,采取措施保证该引用变量引用的对象不会被改变,这样才能创建真正的不可变类。
    3.抽象类:抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类智能被定义成抽象类,抽象类里可以没有抽象方法。
    4.抽象方法没有方法体;抽象类不能实例化,智能作为父类被子类继承。
    5.抽象类可包括成员变量、方法、构造器、初始化块、内部类。构造器主要用于被其子类调用。抽象类是从多各类中抽象出来的模板。
    6.abstract修饰方法时
a.不能和final同时使用,因为子类要重新abstract方法;
b.不能和static一起使用,通过类调用没有方法体的方法会出现错误;(可以同事修饰内部类)
c.不能和private同时使用, 因为子类要重新abstract方法。

    7.接口:是从多个相似类中抽象出来的规范,接口不提供任何实现。接口提现的是规范和实现分离的设计哲学。
    8.接口可以有多个直接父接口,但是接口只能继承接口不能继承类。
    9.接口不能包含构造器、初始化块定义。可以包含成员变量(public static final静态常量),方法(public abstract抽象实例方法、public static类方法、public default默认方法),内部类(public static内部接口、枚举)定义。
    10.System.arraycopy(...)赋值数组方法。
    11.接口提现的是一种规范,模块间的耦合标准,多个程序间的通信标准;抽象类提现的是一种模板式设计。
    
    12.内部类:定义在其他类内部的类被称为内部类。
a.内部类可以直接访问外部类的私有数据(内部类相当于外部类成员),外部类不能访问内部类实现细节。
b.匿名内部类适合用于创建仅需要使用一次的类。必须继承一个类。或者实现一个接口。
    new 实现接口() | 父类构造器(参数列表){类体}
c.可定义在内中任何位置,包括方法中(局部内部类)
d.有四种访问控制权:同一个类、同一个包、父子类和任何位置。
e.成员内部类的classs文件形式:OutClass$InnerClass.class

f.非静态 内部类可以直接访问外部类的private成员:是因为非静态内部类对象里,保存了一个它所寄生的外部类对象的引用(当调用非静态内部类实例的时,必须有一个非静态内部类实例,非静态内部类实例必须寄生在外部类实例里)
g.如果外部类成员变量、内部类成员变量与内部类里的方法的局部变量同名,可通过使用this、外部类类名.this来作为限定区分。
h.非静态内部类的成员变量只在非静态内部类范围是可知的,并不能被外部类直接使用。如果外部类需要访问非静态内部类的成员,则必须显示创建非静态内部类对象来调用访问其实例成员。

i.静态内部类:属于外部类本身,不属于外部类的某个对象。也成类内部类
j.静态内部类不能访问外部类的实例成员,只能访问外部类的类成员,包括静态内部类的实例方法也只能访问外部类的类成员。(因为静态内部类对象只持有外部类的类引用,不持有外部类对象的引用)
k.静态内部类是外部类的一个静态成员,因此外部类的所有方法、初始化块中可以使用静态内部类来定义变量、创建对象。使用静态内部类类名调用类成员、对象调用实例成员。

l.接口内部类只能是静态内部类(public static)

m.在外部类以外的地方创建非静态内部类对象:Out.In in = new Out().new In();PS:非静态内部类的构造器必须使用外部类对象调用。


    13. Lambda 表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例。Lambda表达式的结果就是被当成对象。
    14.Lambda表达式的主要作用就是代替匿名内部类的繁琐语法,他只要给出重写的方法括号以及括号里的形参列表。
    15.函数式接口代表只包含一个抽象方法的接口。可以包含多个默认方法、类方法。
    
    16.枚举类:实例有限而且固定的类。它是特殊的类,可以定义成员变量,方法和构造器。只是枚举类的实例只能是枚举值,而不是通过new来创建枚举类对象。

    17.对象与垃圾回收:程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制它何时被回收。
    18.程序可以强制系统进行垃圾回收(只是通知系统进行垃圾回收):调用静态方法System.gc();调用实例方法Runtime.getRuntime().gc()。
    19.对象在内存中的状态:可达状态--可恢复状态--不可达状态
    20.Java提供了默认机制来清理该对象的资源,机制就是finalize()方法。
finalize()方法特点:不要注定调用,交给垃圾回收机制调用;何时被调用具有不确定性;可能使该对象或系统中其他对象变成可达状态;出现异常抛出继续执行。

(2018.02.26)基础类库
    1.Scanner类 :是一个基于正则表达式的文本扫描器,可以从文件、输入流、字符串中基本类性值和字符串值。
    2.System类 Runtime类 :与程序的运行平台进行交互。System代表当前Java程序的运行平台;Runtime类代表Java程序的运行时环境。
    3.System的identityHashCode(Object x)方法可以唯一的表示该对象。
    4.Object类clone()方法:克隆出来的对象只是原有对象的副本。自我克隆的机制十分高效,但是只是浅克隆,即引用类型的成员变量所指向的对象不会被克隆。
    5.Objects类提供一些工具方法操作对象,大多是空指针安全的。 数组工具类Arrays;集合工具类Clooections。
    6.String类是不可变类,StringBuffer则代表一个字符序列可变的字符串,StringBuilder和StringBuffer相似,StringBuilder是线程安全,StringBuffer没有实现线程安全。
    7.Math工具类可以完成复杂的数学运算。
    8.Random类专门用于生成一个伪随机数;ThreadLocalRandom是加强版的Random,在并发环境下可以多线程资源竞争,最终保证系统具有更好的线程安全性。
    9.BigDecimal类:double类型在进行运算时会发生进度丢失,BigDecimal类可以精确表示计算浮点数。
    10.Date类、Calendar类
    11.JDK8新增 java.time包下的日期、时间包
    12.正则表达式:强大的字符串处理工具,对字符串进行查找、提取、分隔、替换等。是一个用于匹配字符串的模板。
    13.String 中方法 matches(String regex)、replaceAll(.., ..)、split(String regex)   
    14.Pattern(正则表达式变异后在内存中的表示形式)和Matcher类用于提供正则表达式支持。
 Pattern  p = Pattern . compile ( "a*b" );
 Matcher m = p .matcher( "aaaab" );
 Boolean b = m .matches();
    15.JAVA国际化思路:将程序中的标签、提示灯信息放在资源文件中,程序需要支持哪些国家、语言环境就对应提供相应的资源文件。相关类:ResourceBundle、Locale、MessageFormat.
    16.NumberFormat和DateFormat中format()用于将数值、日期格式转化成字符串;parse()将字符串解析成数值日期。
    17.SimpleDateFormat格式化日期
    18.DateTimeFormatter格式化日期时间,相当于DateFormat和SimpleDateFormat的合体。

(2018.02.27)
        1.Object中的一些方法
    public boolean equals(Object obj ) {
        return ( this == obj );
    }

    public native int hashCode();

     public String toString () {
        return getClass().getName() + "@" + Integer. toHexString (hashCode());
    }























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值