Java基础OOP笔记

1、 short s = 1;
//s += 1;
s = (short)(s + 1); //s = s + 1;  s为short,1为int,需要强制转换为short。

容量自动小转大,大强制转小

     byte,short,char->int->long->float->double boolean   1位
字节  1  ,2    ,2   ->4  ->8   ->4    ->8 


2、
&&   与(短路与)  操作数只能是布尔型 一假则假

如果&&前面的表达式为假,则后面的表达式不会被执行。

|| 或(短路或)  操作数只能是布尔型 一真则真

如果||前面的表达式为真,则后面的表达式不会被执行。

& 逻辑与(按位与) 如果操作数是数值,则先转换成二进制,再对其每一位进行与操作。

| 逻辑或(按位或) 同上

^ 异或(按位异或) 相同为False(0),不同为True(1)。


3、运算符的优先级:一算关逻条赋

4、比较if与switch的区别:
相同点:都可以实现分支结构。
不同点:switch只能处理等值的条件判断,且条件是整形变量或字符变量或字符串变量的等值类型
(byte short int  char String(java7后增加的新特性))
多重if在else部分还包含其他if结构,特别适合某个变量处于某个区间的判断。

5、for each循环:
功能等同于for循环,可以遍历数组中所有数据,但是不必使用数组的下标

for(数组元素数据类型 变量名:数组名)

6、从控制台接受参数
两种方式:
一是Scanner类;
二是main方法中的String[]参数
案例:获取控制台输入的参数,存储在main方法的参数中,并打印输出   
 命令行输入参数执行语法:
 java class名称 参数1 参数2 .....参数n
 eclipse中带参数运行
 run as->run configuration->arguments 
 输入参数,多个用回车间隔


7、数组的声明
int[] b = new int[10]; 

int d[] = {23,45};

8、面向对象编程
OOP Object Oriented Programing
三大原则:封装、继承、多态
对象的两个特征:属性(特征)和方法(行为)

封装: 对象和属性和方法常被封装在一起
他们共同体现对象的特性,相辅相成,不能分割

抽象: 将相同或相似的对象归为一类的过程,抽象是分析问题

类:是模板,确定对象将会拥有哪些属性和方法
类是引用类型,非原始数据类型

9、类与对象的区别
类与对象的关系:一对多的关系
类是抽象的概念,或者是个模板,用来表示对象的共性;
对象是个看得见摸得着的具体实体,对象是由类创建;
一个类可以创建多个对象。

10、构造方法(构造器)
是一种特殊的方法,方法名必须与类名相同,并且没有返回值,连void都不用
[访问修饰符]类名(参数列表){

}
构造方法不能主动调用,在创建对象时由JVM调用,一般用public。
每个类都至少有一个构造方法。
在没有定义构造的情况下,类会自动产生一个无参数的默认构造方法。
显示化定义构造方法,默认的构造方法失效。
创建对象时必须执行构造方法,而且只能执行一次。
构造方法执行失败,对象创建失败。
一般在构造方法中给属性赋初始值

11、static
  1.1 static修饰属性(变量)
     在变量的数据类型前加上static关键字,可将其声明为静态成员属性。
静态成员属性在内存中只有一份,即该类所有对象共享。
     静态成员变量的作用域只在类内部,但是成名周期贯穿整个程序。
访问方式:类名.属性名
 
  1.2 static修饰方法
     在方法之前加上static关键字,将其声明为静态方法
静态方法只能对类的静态成员属性进行操作
静态方法中不能使用this引用(this表示当前对象的引用,static不属于具体哪个对象,相互矛盾)
 总结:static用在类的成员(属性和方法)上面
 1)在内存上只有一份拷贝,所有对象共享
 2)静态方法中只能操作静态成员属性
 3)静态方法中不能使用this
 4)通过类名.静态成员(方法或属性)访问
 5)静态成员属性一般尽量先初始化。
 6)静态成员的访问也受访问修饰符的约束。
 
  1.3 static修饰代码块
     static{
  //类加载时就被执行
}
一般用做数据初始化
也遵循静态块只能访问静态变量的原则。

12、重载

   1)方法名相同
   2)参数不同(个数不同、类型不同、顺序不同)
   3)同一作用域(同一个类中)
   与返回值无关

13、继承中构造方法的处理:
   1)构造方法不能被继承
   2)父类如果只有默认的或者显示化无参数的构造方法,则在
      子类构造方法中无须显示化调用,由编译器调用。
   3)父类中有显示化有参数构造方法,则子类构造方法中必须
      调用父类的构造方法。
 
总结: 在子类的构造方法中,一定要在第一行调用父类的构造方法,
        如果父类还有更上级的父类,则一定也是先调用更上级父类的构造方法。

   4)父类的构造方法只负责初始化它的属性,而子类的构造方法
     只考虑自己的属性。
   5)java中的继承是单继承

14、super
表示父类对象的引用
  用法一:子类构造方法中调用父类的构造方法
        super(参数列表)。
  用法二:当父类和子类有相同的成员(属性和方法)时
        用super.成员名来表示父类中的。

15、this
在构造方法中调用另外一个构造方法。
    参数名与成员属性名相同时用this.属性名来表示当前成员属性。

16、类成员的访问修饰符
  public:公开的,外部所有类都能访问的到
  protected:受保护的,同一个包或者父子关系可以访问的到
  默认(缺省)的:同一个包中可以访问
  private:私有的,只有本类中才可以访问的到

17、final
   表示最终的,不能修改的,可以修饰变量、方法、类
  1)当final修饰变量后,这个变量就是常量,不能被修饰
     a)修饰基本数据类型: 静态变量使用前必须赋初始值
         在声明时赋初始值,或者在构造方法中赋初始值。  
     b)修饰对象类型:
   不能更改所指向的对象引用,但是可以更改对象中的属性值
  2)final修饰方法
      代表方法不能被更改,即不能被子类重写
  3)final修饰类
     代表类不能被更改,即类不能被继承(String类)
 
18、重写(覆盖)
  有继承,子类的方法原型(方法名、返回值、修饰符、参数、异常)
  与父类保持一致。
  注意:
  1)子类重写的方法修饰符不能低于父类的。
  2)静态方法和final修饰的方法不能被重写。

19、方法重写与重载比较
  不同点:重写必须要有继承,且要求子类与父类的方法原型保持一致。
          方法重载继承不必须,只要求方法名相同,参数列表则要求不同,
 同一作用域(同一个类中)。
  相同点:都是多态的体现形式,都要求方法名相同
  
20、引用转型
   所有的Student都是Person  ok
   所有的Person都是Student  不安全  error
 
    向上转型
    父类 obj = new 子类(); // 多态中的转型都是向上转型
向下转型 
         子类 obj = new 父类();  //不安全的
   
     相同的对象名调用相同的方法,呈现不同的结果,这就是多态。


向上转型总结:
  1)如果子类重写了父类的方法,父类引用调用此方法时,是调用的子类的
  2)如果子类存在而父类不存在的方法,父类的引用不能进行调用
  3)如果父类存在而子类不存在的方法,父类的引用可以进行调用
  
  父类引用调用重写方法。
  
21、多态
  静态多态:
     也叫编译时多态,编译的时候就确定调用哪个方法,一般是指重载
与继承没有必然关系。
一般认为只要有重载,就构造了静态多态。
  动态多态:
    条件:继承、重写、向上引用转型
 也叫运行时多态,在代码运行的时候才确定调用哪个方法

22、抽象类
  
  父类无法提供具体实现的方法,那么这个方法可以声明为抽象方法。
  语法:
     修饰符 abstract 访问类型  方法名(参数);
  如有一个类中有抽象方法,那么这个类必须声明为抽象类。
  语法:
      修饰符 abstract class 类名{
 
 }
 抽象方法必须在抽象类中,抽象类中不一定要有抽象方法。
 
  1)抽象类中可以有普通方法(构造方法也可以)和成员属性。
  2)抽象类不能被实例化,只能被继承。
  3)抽象类的子类应该实现抽象类的所有抽象方法,如果不能全部实现,则子类也是抽象类。
  4)抽象类中构造方法,一般被子类的构造方法调用。
  5)其实抽象类就是强制要求子类实现抽象方法。

23、接口:

   如果某个类中所有方法都是抽象方法,那么可以考虑将其声明为接口
   语法:
      public interface 接口名{
    属性 // 访问权限都是public static final(可省略),是常量
方法  //abstract省略,方法都是public(可省略)
 }
   
24、接口与抽象类
   抽象类:
   1)不可以实例化,只能被继承
   2)用abstract修饰,可以包含非抽象方法
   3)抽象类的子类必须实现其所有抽象方法,如果没有全部实现,则子类也是抽象类
   4)实现多态:抽象类的引用指向子类对象
   接口:
   1)用interface声明,不能被实例化,只能被实现
   2)接口中所有的方法都是抽象方法,不能包含非抽象方法
   3)接口中的属性都是常量,属性方法都是public修饰的
   4)接口可以多继承
   5)接口可以多实现
   6)实现多态:接口的引用指向实现类的对象

25、异常
   程序中可能出现的错误,异常(空指针、栈溢出、数组越界、
   除数0、数字转换异常、文件不存在)
     String  s = "123";
int number = Integer.parseInt(s);
    Error类:常发生JVM中,表示不能恢复的验证错误
Exception类:程序相关的

常用方法
    getMessage()
printStackTrace()

非受查异常(unchecked):Error类、runtimeException类以及他们的子类,可以不处理

受查异常(checked):必须处理
1、处理异常
   在异常发生的方法内通过try-catch进行捕捉和处理
     try{
   可能发生异常的代码块
}catch(异常类型){
   异常处理
}
1.1)finally关键字:无论是否发生异常,一定会执行,“善后”工作
   应用场景:
      打开文件操作后出现了异常,需要关闭
 建立一个网络连接后出现了异常,需要关闭连接
 数据库资源释放问题
 try{
   打开文件
处理内容  // 异常
关闭文件
 }catch(){
    异常处理
 }finally{
   if(文件未关闭)
     关闭文件
 }
   1.2)多重catch
      异常类层次越低的,越往上写,不论有多少个catch块,最多只会执行其中的一个
   1.3)嵌套catch
2、抛出异常(方法中不处理,交由调用者处理)
    2.1 throw:方法中抛出具体的异常对象


throw抛出异常对象后,捕获程序的流程立即停止,转而寻找异常处理者

处理方式:
1)try-catch
2)throws关键字:方法头声明异常,表示该方法中有异常产生,但是没有处理 

        方法修饰符 返回值  方法名(参数) throws 异常类型(可以多个,用逗号分隔){
  
  }
  此种方式,如果调用者不处理,则异常继续向上抛,直到有方法处理
3、自定义异常
    继承Exception

26、throw和throws的区别


throw:(针对对象的做法)
抛出一个具体的异常类型,需要用户自己捕获相关异常,
而后再对其进行相关包装,最后再将包装后的异常信息抛出

throws:(针对一个方法抛出的异常)
声明一个方法可能抛出的所有异常信息,通常不用显示的捕获异常,
可由系统自动将所有捕获的异常信息抛给上级方法


throw与throws的总结
1)throw语句是用来明确抛出一个异常对象,throw new 异常();
   throws语句用来声明一个方法可能抛出的异常类型 方法头  throws 异常
2) throws语句实际上是将异常抛给调用者,如果调用者不处理,则继续向上抛,直到
   有调用者处理或者最终由JVM处理
3)throw用在方法内部的,throws用在方法头部
4)throw、throws都是消极异常处理方式,积极的处理方式应该是try-catch处理。
5)throw、throws抛出的异常实际上是受查异常(非Error、非runtime异常),其他
异常可以不处理。

27、内部类
   嵌套类,在类中再去定义一个类,看作是外部类的成员
   class A{
      .....
 class B{
 
 }
....
   }
   1)作为外包类的一个成员,可以访问外包类的所有成员,
      包括static、private修饰的成员属性和方法
 
   2)如果内部类与外包类有相同的属性和方法时,怎样区分?
      外包类同名变量/方法:外包类名.this.变量名/方法
 内部类同名变量/方法:this.变量名/方法
 
   3)内部类的访问修饰符public、缺省、private、protected


   4)static修饰内部类 


   5)内部类在除外包类以外的范围使用
       外包类名.内部类名 对象名 = 外包类对象名.new 内部类名();
 A a = new A();
 A.B b = a.new B();
应用场景:数据连接池、设计模式、算法


28、匿名内部类
   没有名字的类 一般是定义在其他类中,只使用一次,简化代码
   可以用在类(抽象类)、接口上,那么其子类的方法都可以使用匿名内部类来实现。
   多线程
   
   总结:
  1)内部类的类名只能用于定义它的外包类的语句中,并且不能和外包类相同
  2)内部类可以看出是类的成员、可访问外包类变量,包含static、private、final修饰的
  3)内部类的访问修饰符可以是private、protected、缺省的、public的
      而普通类只有public、缺省
  4)只有顶层类可以声明static成员,如果内部类需要定义static的成员,
则应将内部类声明为static,一般的内部类成员不会声明为static。
  5)内部类的创建必须依赖于外包类对象
     A a = new A();   A.B b = a.new B();

29、java.lang.*包
  包装类、Exception、Math类、Object类、String类
  基础包、唯一一个不需要手动导入的包,默认导入的
 
1)包装类:
  继承于Number类
  int (32)        Integer    
  double (64)     Double
  short (16)      Short
  float (32)      Float
  long (64)       Long
  byte (8)        Byte
  char (16)       Character
  boolean (1)     Boolean
  eg :int i=10;
      i.setI
 Object obj = new  Student();
 Integer inte = new Integer(10);

2)基本数据类型转换成包装类型
   方式一:通过包装类的构造方法
   Boolean objB = new Boolean(false);
   方式二:通过包装类的valueOf方法
     //  Boolean objB = (Boolean)false;
3)包装类型转换成基本数据类型
    对象名.XXXValue();

4)包装类对象转换成字符串
    对象名.toString();
5)字符串转成包装类对象
    通过包装类的valueOf方法
6)字符串转换成基本类型(除了Character)
   包装类名.parseXXX()
 
30、什么是自动装箱和拆箱
自动装箱就是Java自动将原始类型值转换成对应的对象,
    比如将int的变量转换成Integer对象,这个过程叫做装箱,
    反之将Integer对象转换成int类型值,这个过程叫做拆箱。
因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

    原始类型   byte,short,char     ,int    ,long,float,double,boolean
    封装类为   Byte,Short,Character,Integer,Long,Float,Double,Boolean。


31、java.lang包
String类
String s1 = new String("Java is OOP language");
String s2 = "Java is write once,run anywhere";
    s1、s2是String类型的对象
   
   1)字符串中字符的个数(字符串的长度):length() (数组的长度是length属性)
   2)返回指定索引处的字符:charAt(int i)
   3)字符串的比较
    equals:比较的是字符串的内容(双引号中的数据)是否相等
    ==:比较的是两个字符串对象是否是同一个(比较对象的地址是否相同)
    字符串(常量)池
   4)常用方法:
     搜索字符串: indexOf   lastIndextOf
截取字符串:subString
替换字符串:replace  replaceFrist  replaceAll
更改字符串的大小写:toUperCase  toLowerCase
去掉空格:trim 

String类型的字符串不可更改性、不可继承
  String str3 = "abc";
  str3 = "abcd";//  1、新建一个内容为abcd的String对象
   2、将该对象地址赋给str3
                    3、GC回收"abc"对象;
 一般情况下,如果需要频繁操作字符串,不建议使用String类。


StringBuffer类(线程同步的)
   与String的功能基本一致,但是它的内容是可变的
   StringBuffer sb = StringBuffer("java");   
   append方法:追加内容,操作的是同一个对象
   StringBuffer转成String
   
StringBuilder类(线程不同步的)
   功能几乎与StringBuffer一致
   执行效率上:
      StringBuilder>StringBuffer>String


Math类
  与计算相关的属性和方法
  常量:E  PI
  方法:cos  sin  tan  abs  sqrt  log ......
  四舍五入:    round
  随机数:  random()  产生大于等于0.0 小于1.0


Object类
   equals方法:比较的是地址,与==结果是一致的。
   如果子类没有重写此方法,调用的也是object类中(比较的是地址)
   如果子类重写了此方法,则调用的是子类自己的
   toString方法: 如果子类没有重写,则输出对象当前运行时的地址
   重写了可自定义输出字符串
   
Class类

32、java.util.包
内置的工具包 Random类、日期、日历、集合
Date类(日期类)
某个瞬间的时间对象
   常用:
    Date d = new Date();
   格式化日期:
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(d);
Calendar类(日历类)
    操作日期和时间对象,并且有丰富检索年月日周的方法 
   抽象类,不能直接实例化,但是可以通过以下方法得到对象
    Calendar cal = Calendar.getIntance();
Calendar类与Date类的区别:
  官方不再推荐使用Date,不利于国际化,推荐用Calendar类
  Date表示特定的瞬间,精确到毫秒
  Calendar是个抽象类,操作日历字段(获取下星期的日期)提供一系列的方法

33、java.util中集合框架
  集合:类似于数组,数组的缺点:长度受限制(一经声明,无法修改)
        只能存放相同类型元素
        集合的长度没有限制,可以存放任意类型的元素
List接口及其实现类
   有序,存储顺序与元素添加顺序一致  
   常用方法:
     add()
get()
set()
remove()
size()
clear()
isEmpty()
contains()
ArrayList
   有序、允许重复元素,采用的是顺序表形式实现的
   适用访问、遍历,性能较高
LinkedList
   方法与ArrayList几乎一致,采用的是链表形式实现的
   适用删除、添加元素,性能较高
   
   
Vector
  java5不推荐使用,与ArrayList一样都是顺序表实现的
  1)线程同步的,效率较低,ArrayList是不同步,java5之后对于同步
  问题有集中的处理策略
  2)数据增长型问题,当需要扩充容量时,ArrayList是增长原来的一半,
  但Vector是增长原来的一倍
 ArrayList  10  15  23
 Vecotr     10  20  40        10000 20000


 
Set接口及其子类
    无序、不允许重复
  HashSet:哈希码实现
  TreeSet:树的数据结构实现,与HashSet基本是一致的,
  但是它可以确保集合中元素保持有序,但是泛型类必须实现Comparable接口
  
Iterator
 迭代器是一种设计模式,它可以遍历并选择对象。
 只要实现了Iterator接口的类,都可以通过迭代器遍历。
   hasNext():检测是否还有元素
   next():返回下一个元素
   
Map接口及其子类
   采用键值对存储元素
   key - value  key不能重复,value可以重复
   001  杨亮    
   002  王涛
   003  向荣
   004  杨亮
   005  王涛
   Map中一对键值对看成一个整体对象,叫做Entry,它是定义在
   Map接口中的
   HashMap
   TreeMap
   
34、集合中元素排序(合并算法)
步骤1:元素类实现Comparable接口,实现compareTo方法
步骤2:采用Collections.sort()对集合进行排序



 


有序否 允许元素重复否
Collection                                  否  是


List           是  是 


AbstractSet  否  否
Set           HashSet  否  否


TreeSet  是(用二叉树排序)  否




AbstractMap  否 使用key-value来映射
Map HashMap  否 和存储数据,
Key必须惟一
TreeMap  是(用二叉树排序)   value可以重复


















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值