java-01-基础语法

来源:互联网 发布:纯粹主义 美学 知乎 编辑:程序博客网 时间:2024/05/23 09:56
J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME。J2ME,The Micro Edition of the java 2 Platform。主要用于嵌入式Java,如手机,PDA等等。J2EE,Java 2 Platform,Enterprise Edition,就是所谓的企业级Java,适合企业的大型应用开发。

01-注释  
单行//
多行/**/

02-左移就是乘以2的次幂运算
3<<2  =  3*2^2
右移就是就是除以2的次幂运算,原最高位是什么就是什么。
>>

>>>无符号右移

两个思考题
01- 2*8最高效的计算方法   用位移2<<2
02- 怎么把两个变量不通过第三方变量就交换两个的值  
解决方法: 01-用加减法  a= a+b;b= a-b; a=a-b;
                    02-用异或 a = a ^ b
                                    b = a ^ b
                                    a = a ^ b
因为3^7^7结果是3,就是异或一个数两次就会得到原来的数。

面向对象:

构造方法

l  构造方法的格式:
修饰符 构造方法名(参数列表)
{
}
    l  构造方法的体现:
    n  构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。
    n  构造方法名称必须和类型保持一致。
构造方法没有具体的返回值

在new对象时要调用构造方法。现在来看看如何调用构造方法。

每个class都有一个构造方法,无论是否自己写上。

Person p = new Person();这个是调用无参的构造方法
// Person的构造方法,拥有参数列表
    Person(int a, String nm) {
        // 接受到创建对象时传递进来的值,将值赋给成员属性
        age = a;
        name = nm;
    }
这个时候就需要这样写:Person p = new Person(a,b);

调用构造方法的格式:
   调用本类中的构造方法
this(实参列表);
调用父类中的空参数构造方法
super();
调用父类中的有参数构造方法
 super(实参列表);

       子类构造方法执行时中,调用了父类构造方法,这说明,子类构造方法中有一句super()。
那么,子类中的构造方法为什么会有一句隐式的super()呢?
原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。
当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法。
子类的所有构造方法直接或者间接都必须调用到父类的构造方法,若父类有多个构造方法,只需要调用到其中一个构造方法就行。不要求调用到父类的所有的构造方法。


如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?
这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
父类构造方法中是否有隐式的super呢?
也是有的。记住:只要是构造方法默认第一行都是super();
父类的父类是谁呢?super调用的到底是谁的构造方法呢?
Java体系在设计,定义了一个所有对象的父类Object

final作用:不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。

final修饰类不可以被继承,但是可以继承其他类。
final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
l  final修饰的变量称为常量,这些变量只能赋值一次。

final修饰的成员变量,需要在创建对象前赋值,否则报错。可以在创建对象时所调用的构造方法中,为变量n赋值;也可以在创建成员变量的时候就赋值finalint m = 100;,但是不能用set方法来给final的成员变量赋值。


static
它是静态修饰符,一般用来修饰类中的成员。
l  被static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量
l  被static修饰的成员可以并且建议通过类名直接访问。
访问静态成员的格式:
类名.静态成员变量名
类名.静态成员方法名(参数)
对象名.静态成员变量名       ------不建议使用该方式,会出现警告
对象名.静态成员方法名(参数)     ------不建议使用该方式,会出现警告
注意事项
l  静态内容是优先于对象存在,只能访问静态,,静态的优先于非静态的,它先于存在,所有调用不了非静态的,因为生命周期不一样,就像200年前的人不能知道现在的事一样。对象是非静态的,所以也不能使用this/super。静态修饰的内容存于静态区。静态的消失是跟class的生命周期一样长,有点浪费资源了。

应用场景:
用于修饰成员变量和成员方法,在定义实物的时候,多个事物是否具有共性的数据,有就可以定义为静态的成员变量。
成员方法加static,是要根据变量来走,如果方法中没有调用过非静态的成员变量,也就是调用的都是静态的成员变量或者没有调用到成员变量的时候就将方法定义为静态。
class Demo {
    //成员变量
    public intnum = 100;
    //静态方法
    public staticvoid method(){
        //this.num; 不能使用this/super
        System.out.println(this.num);
    }
}
l  同一个类中,静态成员只能访问静态成员
class Demo {
    //成员变量
    public intnum = 100;
    //静态成员变量
    public staticint count = 200;
    //静态方法
    public staticvoid method(){
        //System.out.println(num);静态方法中,只能访问静态成员变量或静态成员方法
        System.out.println(count);
    }
//静态方法,没有调用到非静态的成员属性,所以设置为静态
    public staticvoid meth(int a , int b ,int c){
        
        System.out.println(a+b+c);
    }
}
l  main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中。

静态常量
定义格式:
public static final 数据类型 变量名= ;
public staticfinal String COMPANY_NAME ="传智播客;

当我们想使用类的静态成员时,不需要创建对象,直接使用类名来访问即可。
System.out.println(Company.COMPANY_NAME);//打印传智播客
Company.method(); // 调用一个静态方法
l  注意:
接口中的每个成员变量都默认使用public static final修饰。
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
interface Inter {
    public static final int COUNT= 100;
}
           访问接口中的静态变量
Inter.COUNT

l  内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。
class 汽车 { //外部类
    class 发动机 { //内部类
}
}
内部类分为成员内部类与局部内部类。

在内部类中可以直接访问外部类的所有成员。
外部类调用内部类的方法属性:
外部类名.内部类名 变量名= new 外部类名().new内部类名();


在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:
 
public
protected
default
private
同一类中
同一包中(子类与无关类)
 
不同包的子类
 
 
不同包中的无关类
 
 
 
           归纳一下:在日常开发过程中,编写的类、方法、成员变量的访问
l  要想仅能在本类中访问使用private修饰;
l  要想本包中的类都可以访问不加修饰符即可;但是在别的包是不能使用。
l  要想本包中的类与其他包中的子类可以访问使用protected修饰
l  要想所有包中的所有类都可以访问使用public修饰。
l  注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

局部代码块:定义在方法中的,用来限制变量的作用范围
构造代码块:定义在类中方法外,用来给对象中的成员初始化赋值
静态代码块:定义在类中方法外,用来给类的静态成员初始化赋值
class Demo{
    public static void main(String[] args)    {
        {
               int x = 1;
               System.out.println("普通代码块" + x);
        }
        int x = 99;//这里不能方法上面括号中的x
        System.out.println("代码块之外" + x);
    }
}
结果:
普通代码块1
        代码块之外99

执行次序:先静态代码块 (只执行一次)— 构造代码块(new一次执行一次) —— 局部代码块

导出说明文档时出现乱码:-encoding UTF-8 -charset UTF-8 

toString方法
        * a: 为什么要重写toString方法
            * toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
            * 由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
            * Object类中的toString的核心代码
                getClass().getName() + "@" + Integer.toHexString(hashCode()) 
            * 由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
        * b: 案例核心代码(重写Person类中的toString方法)
            /*
             * 重写父类的方法toString()
             * 没有必要让调用者看到内存地址
             * 要求: 方法中,返回类中所有成员变量的值,但不写静态变量。
             */
            public String toString(){
                return name + age;
            }    


:String类
            * API中的String类的描述,发现String 类代表字符串
            * Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
            * 字符串是常量,在创建之后不能更改
            * 其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
            * 源码分析,String类底层采用的是字符数组:
                private final char value[]
                private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数组,就无法改变数组中元素的值
                final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了

:String类的其他方法
        * a: 方法介绍
            * int length(): 返回字符串的长度
            * String substring(int beginIndex,int endIndex): 获取字符串的一部分
            * String substring(int beginIndex): 获取字符串的一部分
            * boolean startsWith(String prefix): 判断一个字符串是不是另一个字符串的前缀,开头
            * boolean endsWith(String prefix): 判断一个字符串是不是另一个字符串的后缀,结尾
            * boolean contains (String s): 判断一个字符串中,是否包含另一个字符串
            * int indexOf(char ch):  查找一个字符,在字符串中第一次出现的索引,被查找的字符不存在,返回-1
            * byte[] getBytes(): 将字符串转成字节数组,此功能和String构造方法相反,byte数组相关的功能,查询编码表
            * char[] toCharArray(): 将字符串转成字符数组,功能和构造方法相反
            * boolean equals(Object obj): 方法传递字符串,判断字符串中的字符是否完全相同,如果完全相同返回true
            * boolean equalsIgnoreCase(String s): 传递字符串,判断字符串中的字符是否相同,忽略大小写   

StringBuffer类概述
        * 通过JDK提供的API,查看StringBuffer类的说明
        * 线程安全的可变字符序列 
        * 底层采用字符数组实现,初始容量为16
    * B:StringBuffer和String的区别
        * String是一个不可变的字符序列
        * StringBuffer是一个可变的字符序列
a: 方法介绍
 StringBuffer append(), 将任意类型的数据,添加缓冲区
                *  append 返回值,写return this
                *  调用者是谁,返回值就是谁
            * delete(int start,int end): 删除缓冲区中字符
                *  开始索引包含,结尾索引不包含
            * insert(int index, 任意类型): 将任意类型数据,插入到缓冲区的指定索引上
            * replace(int start,int end, String str): 将指定的索引范围内的所有字符,替换成新的字符串
            * reverse(): 将缓冲区中的字符反转
            * String toString(): 继承Object,重写toString()
                *   将缓冲区中的所有字符,变成字符串

StringBuilder的概述
        * 通过查看API了解一下StringBuilder类
    * B:面试题
        * String,StringBuffer,StringBuilder的区别
            * StringBuffer和StringBuilder的区别
                * StringBuffer是jdk1.0版本的,是线程安全的,效率低
                * StringBuilder是jdk1.5版本的,是线程不安全的,效率高

            * String和StringBuffer,StringBuilder的区别
                * String是一个不可变的字符序列
                * StringBuffer,StringBuilder是可变的字符序列

 Math类:数学运算工具类
          abs方法,结果都为正数
          ceil方法,结果为比参数值大的最小整数的double值
          floor方法,结果为比参数值小的最大整数的double值
          max方法,返回两个参数值中较大的值
          min方法,返回两个参数值中较小的
          pow方法,返回第一个参数的第二个参数次幂的值
         round方法,返回参数值四舍五入的结果
     random方法,产生一个大于等于0.0且小于1.0的double小数

 double和float类型在运算中很容易丢失精度,造成数据的不准确性,Java提供我们BigDecimal类可以实现浮点数据的高精度运算,建议浮点数据以字符串形式给出,因为参数结果是可以预知的

增强for循环遍历数组

* 格式:
* for( 数据类型 变量名 : 数组或者集合 ){
* sop(变量);
* }

String[] str = {"abc","itcast","cn"};
 for(String s : str){
       System.out.println(s.length());
 }