现在的位置: 首页 > 综合 > 正文

Java 学习笔记(基本概念)

2018年04月04日 ⁄ 综合 ⁄ 共 5843字 ⁄ 字号 评论关闭

1,基本概念  
        向过程的思想:由过程、步骤、函数组成,以过程为核心。先有算法,后有数据结构。
        面向对象的思想:以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。先有数据结构,后有算法。
     Java虚拟机代码被存储在.class文件中,每个文件都包含最多一个public类。
     编译器在获取Java应用程序的源代码后,将其生产字节码,它是为JVM生成的一种机器码指令。
    Java编程语言解除了程序员取消分配存储器的责任,它可提供一种系统级线程以跟踪每一存储器的分配情况。在Java虚拟机的空闲周期,垃圾收集线程检查并释放那些可被释放的存储器。
    javaHello.java——>编译  Hello.class
    加载代码——>校验代码——>执行代码
    类加载器:为程序的执行加载所需要的全部类。
 
2,名门规则
类: 类中单词的首字母大写
局部变量:定义在方法之中的变量,要先赋值再进行运算
实例变量:定义在类中,但在方法之外,实例变量的对象赋值为null
注意:实例变量和局部变量允许命名冲突

3,构造方法
构造方法是当用类生成对象时,系统在生成对象的过程中利用的方法。
用类来生成对象的语句: Student s = new Studeng();
此时S成为一个对象变量,存储的是地址,首地址被赋予S空间。
注意:在对象变量中存放的是引用(地址);在简单变量中存放的是数值。
     可以有多个构造方法,但多个构造方法的参数表一定不同,参数顺序不同既属于不同的构造方法。如果我们未写构造方法,则系统会自动生成一个空的构造方法。

4,重载和覆盖
在JAVA中将Overloading 称为重载,overriding称为覆盖。
重载:在一个类中可以定义多个同名的方法,各个方法的参数表一定不同,但是修饰词可能相同,返回值也可能相同。
子类可以从父类继承一个方法,也可以定义一个同名异参的方法,也称为重载。
Overloading方法从低向高转:
          Byte——short——float——int——long——double
在构造方法中,this()表示调用本类的其他构造方法。
特别注意:用this调用其他构造方法时,this必须为第一条语句,然后才是其他语句。
this表示的是当前对象,区分实例变量和局部变量时一定要写this.

覆盖:当子类从父类继承了一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。注意返回值类型必须相同,否则出错。

5,继承
父类的非私有化属性和方法可以默认继承到子类。
父类的构造方法子类不可以继承,更不存在覆盖的问题。
Java不允许多继承,一个类有且只有一个父类。
Java的数据结构为树型机构,而非网状机构。Java可以通过接口和内部类实现多继承。

对于方法的修饰词,子类方法要比父类的范围更加宽泛。如果父类为public,子类为private则出错。之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。
范围顺序
private: 本类访问
default: 表示默认,不仅本类访问,而且是同包可见。
protected: 同包可见,不同包的子类可见。
public:所有地方均可见

构造一个对象的顺序:递归构造父类对象,顺序调用本类成员属性赋初值语句,本类构造方法。

Super() 表示调用父类的构造方法,和this一样必须放在第一行。如果没有定义构造方法,那么就会调用父类的无惨构造方法既:super()。

6,多态
     多态指的是编译时类型变化,而运行时类型不变。多态分两种:
编译时多态: 编译时动态重载。
运行时多态:指一个对象可以具有多个类型。
Animal a = new Dog();   Dog d = (Dog)a; 声明父类来引用子类。

运行时多态的三个原则:(应用时覆盖)
1)对象不变,改变的是主观认识。
2)对于对象的调用只能限于编译时类型的方法。注意:编译时类型一定要为运行时类型的父类,或者同类型。
如a只能调用Animal的方法,而d可以调用运行时Dog的方法。
3)在程序运行时,动态类型锁定。运行时调用运行时类型,既它调用覆盖后的方法。

7,关系运算符 instanceof
a instanceof Animal 这个表达式结果是一个布尔表达式,a为对象变量,Animal为类名。
上面语句是判断a是否可以贴Animal标签。如果可以返回true否则返回false
用于判断是否将前面的对象变量赋值后边的类名,一般用于判断在强制类型转换之前判定变量是否可以强制转换。
封装、继承、多态是面向对象的三大特性。运行时的动态类型判定针对的是方法,运行程序访问的属性仍然为编译时属性。

8,修饰符
static: 可修饰变量,方法,代码块。
static int num; 说明num为类变量,为一个类的共享变量,属于整个类。访问:类名.变量名
public static void printData() {} 表面此方法是类方法(静态方法),不需要对象。可以使用类名调用。注意静态方法中不允许访问类的非静态成员,包括成员的变量和方法。
一般情况下:主方法是静态方法,所有可调用静态方法。是因为它是整个系统软件的入口,而进入入口时系统没有任何对象,只能使用类调用。
覆盖不适用于静态方法。允许在子类中定义同名静态方法,但是没有多态。
代码块:修饰代码块,此代码块要在此类的任何一个方法之外。这个代码块在代码被装载进虚拟机生成对象时被装载一次,以后就再也不执行了。一般静态代码块被用来初始化静态成员。

final: 修饰类,属性和方法。
当用final修饰类的时候,此类不可被继承,防止子类覆盖。
当用final修饰变量(属性)的时候,此时变量为常量。注意:常量需要大写 常量的地址不可变,但是地址中保存的值可以改变。可以配合static使用。
常量:在初始化的时候通过显示声明赋值,在构造的时候赋值。局部变量可以随时赋值。
当用final修饰方法时:表示这个方法不可覆盖。
如果一个方法前有修饰词private或static,则系统会自动在前面加上final。即private和static方法默认均为final方法。

abstract: 修饰方法、类。
表示抽象方法,此时方法不需要实现,实现留给子类覆盖。
如果一个类中有一个抽象方法,那么这个类一定为一个抽象方法。
反之,如果一个类为抽象类,那么其中可能有非抽象的方法。
所以子类的方法必须覆盖父类的抽象方法,方法才能起作用。

Abstractstatic不能放在一起,否则便会出现错误。(这是因为 static不可被覆盖,而abstract为了生效必须被覆盖。)
例如:
public class TestClass {
     public static void main(String[] args) {
          SuperClass sc = new SubClass();
          sc.print();
     }
     Abstract class SuperClass{
          Abstract void print(); }
}

class SubClass extends SuperClass() {
     void print() {
          System.out.println("Hello World"); }
}

9,接口interface
接口是 一种特殊的抽象类。
public interface: 公开接口。
与类相似,一个文件只能有一个public接口,且与文件名相同,在一个文件中不能同时定义一个public接口和一个public 类。
注意:一个接口中,所有的方法为公开、抽象方法;所有的属性为公开、静态、常量。
一个类实现一个接口的格式:
     class IAImple implements IA {};
一个类实现接口,相当于它继承一个抽象类。类必须实现接口中的方法,否则其为一个抽象类。
接口中可不写 public,但在子类中实现接口的过程中 public不可省。
注意:
1)一个类可继承另外一个类,还可以实现接口。
2)一个类只能继承另外一个类,但是可以继承多个接口,中间用,隔开。
3)接口和接口之间的关系可以定义继承关系,并且接口之间运行实现多继承。
interface IC extends IA, IB {};
4)接口也可定义对象。 IA I = new IAImpl();
实现的类从父类和接口继承的都可做运行时类型。
 
10, 高级访问控制
 
11,内部类
   允许一个类定义被放到另一个类里,把类在逻辑上组织在一起,可以访问他们所嵌套的类的范围。
     
类内部属性:     
     类名称只能用在定义过的范围中,除非用限定的名称。
     内部类可以被定义在方法中
     任何变量,无论是本地变量还是正式参数,如果变量被标识为final,那么久可以被内部类中的方法访问。
     内部类可以使用被嵌套的类和实例变量以及所嵌套的块中的本地变量。
     内部类可以被定义为abstract
     只有内部类可以 被声明为private或 protected,以便防止它们不受来自外部类的访问。访问保护不阻止内部类使用其他类的任何成员。
     一个内部类可以作为一个接口,由另一个内部类实现。
     被自动声明为static的内部类成为顶层类,这些内部类失去了在本地范围和其他内部类中使用数据和变量的能力。
     内部类不能声明任何static成员,只有顶层类可以声明static成员
 
12,异常
 
     异常类定义程序中可能遇到的轻微的错误条件,可以写代码来处理异常并继续程序执行,而不是让程序中断。
发生下列情况时,会出现异常:
     想打开的文件不存在
     网络连接中断
     受控操作数超出预定范围
     非常感兴趣的正在装载的类文件丢失
     
异常处理:
     try {
               // code that might thwos a particular exception 
     } catch (MyExceptionType e) {
               // code to execute if a MyExceptionType exception is thrown
     } catch (Exception e) {
               // code to execute if a general Exception is thrown
     }
 
     要处理特殊的异常,将能够抛出异常的代码放入try中,然后创建相应的catch块的列表。如果生成的异常与catch中提高的相匹配,那么catch条件的块语句就被执行。
调用栈机制:
     如果方法中一个语句抛出一个没在相应的try/catch块中处理的异常,那么这个异常被抛出到调用方法中,如果在调用方法中也没被处理,它就被抛出到该方法的调用程序,这个过程一直延续到异常被处理,直到回到main()中,如果main也处理它,那么该异常就中断程序。
finally语句:
     定义一个总是执行的代码快,而不考虑异常是否被捕获。
     try {
          .....
     } catch {
          .....
     }
     finally {
          stopFaucet();
     }
 
异常分类:
     异常分三类:Java.lang.Throwable类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。它有Error 和 Exception两个基本子类。
 
 
Throwable类不能使用,而使用子类异常中的一个来描述任何特殊异常
     Error: 表示恢复不是不可能但是很困难的情况下的一种严重问题,如内存溢出。
     RuntimeException:表示一种设计或实现问题。
共同异常:
     ArithmeticException
          整数倍 0 除
     NullPointerException
          对象没有被实例化时,访问对象的属性或方法。
     NegativeArraySizeException
          创建带负维数大小的数组的尝试
     ArrayIndexoutofBoungdsException
          访问超过数组大小范围的一个元素的尝试
     SecurityException
          典型的被抛出到浏览器中,SecurityManager类抛出一个applets的异常,该异常企图做下述工作:
               ——访问一个本地文件
               ——打开主机的一个socket,这个主机与服务于applet的主机不是同一个
               ——在运行时环境中执行另一个程序
处理或声明规则:
     用try-catch-finally来处理异常
     用throws 字句声明代码能引起一个异常
创建自己的异常:
     通过扩展Exception类来创建自己的异常。
public class ServerTimeOutException extends Exception {
     private String reason;
     private int port;
    
     public ServerTimeOutException (String reason, int port) {
          this.reason = reason;
          this.port = port;     
     }
     
     public String getReason() {
          return reason;
     }

     public int getPort() {
          return port;
     }
}
     
public void connectMe( String serverName ) throws 
     ServerTimeOutException {
     int success;
     int portToConnect = 80;
     
     success = open(serverName, portToConnect);
     if (success == -1) {
          throws new ServerTimeOutException("Could not connect", 80);
     }
}

public void findServer() {
     ....
     try {
          connectMe(defaultServer);
     } catch(ServerTimeOutException e) {
          
          System.out.println("Server time out");
     
          try {
               ConnectMe(alternateServer);     
          } catch (ServerTimeOutException e) {
               System.out.println("No server available");
          }
     }
}

抱歉!评论已关闭.