Java基础概念

Java语言的优点

  1. Java为纯面向对象的语言
  2. 平台无关性。由于Java是解释型语言,编译器会把Java代码变成“中间代码”,然后再Java虚拟机上解释执行。由于中间代码与平台无关,因此,Java语言可以很好的跨平台执行,具有很好的移植性。
  3. Java提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间,例如,Java语言提供了对多线程的支持,提供了对网络通信的支持,最重要的是提供了垃圾回收器,使得开发人员从对内存的管理中解脱出来。
  4. 提供了对web应用开发的支持。例如,applet、servlet、JSP可以用来开发web应用程序。
  5. 具有较好的安全性和健壮性。为了增强程序的安全性,Java语言提供了一个防止恶意代码攻击的安全机制。Java的强类型机制、垃圾回收器、异常处理和安全检查机制使得用Java语言编写的程序有很好的健壮性。
  6. 除了C++语言中难以理解、容易混淆的特性,例如头文件、指针、结构、单元、运算发重载、多重继承等,使得程序更加严谨、简洁。

Java与C/C++有什么异同

  1. Java为解释性语言,其运行过程为:源程序代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C/C++慢,但是Java能够跨平台,而C/C++不能。
  2. Java为纯面向对象语言,所有代码必须在类中实现,除基本数据类型外(包括int,float),所有的类型都是类。此外,Java语言中不存在全局变量或全局函数,而C++兼具面向过程和面向过程编程的特点,可以定义全局变量和全局函数。
  3. 与C/C++语言相比,Java语言中没有指针的概念,这有效防止了C/C++C语言中操作指针可能引起的系统问题,从而使程序变得更加安全。
  4. 与C/C++相比,Java语言不支持多重继承,但Java语言中引入了接口的概念,可以同时实现多个接口。由于接口也具有多重特性,因此在Java语言中可以通过实现多个接口来实现C++语言中多重继承类似的目的。
  5. 在C++语言中,需要开发人员去管理对内存的分配(包括申请和释放),而Java语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式地管理内存的分配。在C++语言中,通常会把释放资源的代码放入析构函数中,Java语言中没有析构函数,但是有finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占用的内存空间何时会被释放。
  6. C++语言支持运算符重载,而Java语言不支持运算符重载
  7. Java具有平台无关性,即对每种数据类型都分配固定长度,例如,int类型总是占据32位,而在C/C++中,同一数据类型在不同的平台上会分配不同的字节数。
  8. Java提供了一些标准库,用于完成特定的任务,同时这些库简单易用,能够缩短开发周期,例如,JDBC库用于访问数据库,用于实现分布式对象的RMI等标准库。

public static void main(String[] args)详解

该方法是Java程序的入口,JVM在运行程序时,会首先查找main()方法。public是权限修饰符,表明类或对象都可以访问这个方法,static表明main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名main()直接访问,JVM访问时就是按照上述方法的签名来查找方法的入口地址,若能找到,就执行;找不到,则会报错。void表明方法没有返回值,main是JVM识别的特殊方法名,是程序的入口。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段。
1、通常来讲,要执行一个类的方法,先必须实例化一个类的对象,然后通过对象来调用这个方法。但由于main是程序的入口方法,此时还没有实例化对象,因此在编写main()方法时就要求不需要实例化对象就可以调用这个方法,鉴于此,main()方法需要被定义为public 和static.
main方法不管怎么定义,必须保证返回值是void,并有static和public关键字修饰。同时,不能使用abstract关键字来修饰。

//以下方法正确
static public void main(String[] args)
public static final void main(String[] args)
static public synchronized void main(String[] args)

2、虽然每个类都可以定义main()方法,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法。如下所示:

class T{
 		public void main(String[] args)
 			system.out.println("T main");
 }
 public class Test{
 	//程序入口函数
 	public staic void main(String[] args){
 		system.out.println("Test main程序入口方法")
 	}
 }

在main()方法执行前输出“hello world”

在Java语言中,由于静态代码块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态代码块实现输出“hello,world”的功能。

public class codeBlock {
    static {
        System.out.println("hello,world1");
    }
    public static void main(String[] agrs){
        System.out.println("hello,world2");
    }
}

//输出:hello,world1
//	   hello,world2

Java程序初始化顺序

在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

Java程序的初始化一般遵循三个原则:
①静态对象优先于非静态对象初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。
②父类优先于子类初始化。
③按照成员变量的定义顺序进行初始化。即使变量定义在散布于方法定义之中,他们仍然在任何方法(包括构造函数)被调用之前先初始化。
Java程序初始化工作可以在很多不同的代码块中完成。它们的执行顺序如下:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。

package Test1;

//先静态(先父类后子类)后非静态
class Base {
    static {
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类非静态代码块");
    }
    public Base(){
        System.out.println("父类构造函数");
    }
}
class Derived extends Base{
    static {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类非静态代码块");
    }
    public Derived() {
        System.out.println("子类构造函数");
    }

    public static void main(String[] args) {
        new Derived();  //初始化
    }
}

在这里插入图片描述

Java作用域

在Java语言中,变量的类型主要有三种:成员变量、静态变量和局部变量。
1、类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,知道这个被实例化对象的生命周期结束时,成员变量的生命周期才会结束。
2、被static修饰的成员变量被称为静态变量或全局变量,与成员变量不同,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间。因此,可以通过类名和变量名来访问静态变量。
局部变量的作用域与可见性为它所在的花括号内。
成员变量的四种作用域:

作用域与可见性当前类同一package子类其他apckage
public
private×××
protected×
default××

这些修饰符只能修饰成员变量(类内),不能修饰局部变量(方法内)。private和protected不能用来修饰类(只有public、abstract、final能修饰类)

一个Java文件中定义多个类

一个Java文件中可以定义多个类,但是最多只能有一个类被public修饰,并且这个类的类名与文件名必须相同,若文件中没有public的类,则文件名随便是一个类的名字即可。

什么是构造函数

构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。在Java语言中,构造函数具有如下特点:

  1. 构造函数必须与类的名字相同,并且不能有返回值。
  2. 每个类可以有多个构造函数。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个没有参数默认的构造函数,但该构造函数不会执行任何代码。
  3. 构造函数可以有0个、1个或者1个以上的参数。
  4. 构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用,必须由系统调用。构造函数在对象实例化时会被自动调用,且只运行一次;而普通的方法是在程序执行时被调用,且可以被该对象调用多次。
  5. 构造函数的主要作用是完成对象的初始化工作。
  6. 构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。
  7. 子类可以通过super关键字来显式地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数时,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下,编译器会默认调用父类提供的无参数的构造函数。当有父类时,在实例化对象时先执行父类的构造函数,然后执行子类的构造函数

引申:普通方法是否可以与构造函数有相同的方法名?
可以。实例如下:

public class Test {
    public Test(){
        System.out.println("construct");
    }
    public void Test(){
        System.out.println("call Test");
    }

    public static void main(String[] args) {
        Test T = new Test();    //调用构造函数
        T.Test();   //调用Test方法
    }
}

在这里插入图片描述

Java接口

由于Java不支持多继承,即一个类中只能有一个父类,为了克服单继承的特点,Java语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一个特殊的抽象类。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域都是public,接口中的常量值默认使用public static final修饰。一个类可以实现多个接口,可以达到类似于多重继承的目的。
在Java语言中,有些接口内部没有任何声明任何方法,也就是说实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又叫做标识接口,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型。类似于汽车的LOGO。Java类库中已存在的标识接口有Cloneable和Serializable等。

Java反射机制

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时允许对其内部的成员进行操作。
具体而言,反射机制提供的功能有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。

class Base{
    public void f(){
        System.out.println("Base");
    }
}
class Sub extends Base{
    public void f(){
        System.out.println("Sub");
    }
}
public class Test2 {
    public static void main(String[] args) {
        try{
            Class c = Class.forName("sub");
            Base b = (Base)c.newInstance();
            b.f();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

在反射机制中,class是一个非常重要的类,有如下三种方法获取到class类:

  1. class.forName(“类的路径”),如上所示
  2. 类名.class
  3. 实例.getClass()

Java创建对象的几种方式:

  1. 通过new语句实例化对象
  2. 通过反射机制创建对象
  3. 通过clone()方法创建一个对象
  4. 通过反实例化的方法创建对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值