java简介:
#面向对象和面向过程的区别
面向过程:一个产品的全部制作过程都由一个人负责,不分工;
面向对象:一个产品制作都多个人来完成,每个人负责属于自己的工序,分工明确;
#面向对象的三大特性:封装、继承、多态
1、封装:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法类实现对隐藏信息的操作和访问。(private修饰的属性需通过setter和getter方法设置值和获取值)
2、继承:子类会无条件拥有父类全部可继承的属性和方法。只支持单继承,继承是类在继承,而不是对象在继承。作用:可以重写父类的方法,扩展性好。(关键字this代表的是当前对象,而关键字super使用的父类方法)
3、多态:父类的引用指向了子类的对象。作用:消除类型之间的耦合关系。
#类和对象
类:首字母要大写,采用大驼峰命名,有具体含义;
属性:private修饰是对属性的封装,目的不让外界直接访问;
setter和getter方法:设置和获取属性的内容(属性被private封装后,通过setter和getter方法来操作其属性);
构造方法:new对象,开辟空间;构造方法也可以重载,只考虑参数的类型和个数,并且方法名和类名一定要一致;一个类中的构造方法重载,所有的重载方法都要按照参数的个数由多到少,或由少到多;
行为或者方法:非静态方法;
匿名对象:没有栈内存指向的堆内存空间,就是一个匿名对象;其特点为开辟了堆内存空间的实例化对象,只能使用一次,且使用后被GC回收。
类和对象的关系是什么?如何创建对象和使用对象?
类是对象模板,对象是类的实例;类只有通过对象才可以分配属性和调用的方法,对象的创建依靠关键字new;
对象的比较:
判断两个对象是否相等,需要依次比较对象中的每一个属性的内容。
注意:
(1)开发中尽量减少垃圾的产生(没有被栈区指向的对象)。
(2)引用传递核心的一句话,一块堆内存空间(保存对象的属性信息)可以被多个栈内存所共同指向,每一个栈内存都可以修改同一块堆内存空间属性值。
#String类
String两种对象实例化方式(String类的特殊之处)
方式一:采用直接赋值字符串的形式为String类的对象实例化;
方式二:采用String类的构造方法为String类的对象实例化;(构造方法为public String(String str);)
String str = "Hello";//直接赋值
String str = new String("Hello");//构造方法
请解释String类型中的“==”和“equals()”的区别?
==:比较两个字符串的内存地址的数值是否相等,属于数值比较;
equals():比较两个字符串的内容是否相等,属于内容比较;
字符串常量是String类的匿名对象;例如:String str = “Hello”;
解释String类两种实例化对象的区别?
直接赋值:只开辟一块堆内存空间,字符串内容可以自动入池,一供下次使用;
构造方法:开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,需要使用intern()手工入池;(一个是匿名对象空间,一个是new出来对象空间)
在实际开发中,String对象的初始化永远都采用直接赋值的方式完成。
字符串一旦声明,则不可改变;
String类的常用方法:
字符串与字符数组char[]
字符串与字节数组byte[]
字符串比较
字符串查找
字符串替换
字符串截取
字符串拆分
#this关键字3大功能
(1)表示本类属性,
调用本类属性:“this.属性”;
(2)表示本类方法,
调用本类普通方法:要调用本类的方法“this.方法()”;
调用本类构造方法:一个构造方法中调用其他构造“this()”;
(3)表示当前对象,
this表示当前对象;
#static关键字使用
static修饰的属性叫类属性,其特点如下,
(1)使用static定义的属性,不在堆内存保存,在全局数据区保存;
(2)使用static定义的属性表示类属性,类属性可以由类名称直接调用(但可在没有实例化对象中调用);
(3)切记,开发中,大部分情况下类定义的都是普通属性,而不是static属性;
static属性:(private static String country=“中国”;)
static属性保存在全局数据区,如果一个对象修改了country属性,势必影响其他对象的country属性内容,
由一个对象修改是不合适的,应该由所有的对象的公共代表的类来操作,即static属性最好通过类名称来调用(“类名称.static属性”)。
static修饰方法,
static定义的方法不能调用非static属性和方法(原因使用static定义的属性和方法,可以在没有实例化对象的时候使用);
非static定义的方法不能调用static属性和方法(原因使用非static定义的属性和方法,必须在实例化对象后调用);
static使用原因
在实际工作中,使用关键字static修饰属性和方法,
(1)希望在没有实例化对象时候,轻松执行类的某些操作;
(2)数据共享;
简单Java类开发基本原则:(技术穿越:简单Java类是现在最为重要的开发模型。)
(1)类名称必须表示一个类的定义;
(2)类中的属性必须使用private进行封装;
(3)类中的属性定义相应的setter和getter方法;
(4)类中可以提供构造方法为属性初始化,但是不管多少个构造方法,一定要保留一个无参构造方法;
(5)类中不允许直接使用System.out.println()输出,所有的内容要返回给被调用出输出;
#常见的内存区域
Java中主要存在四块内存空间,这些内存空间的名称和作用如下,
(1)栈内存空间:保存所有的对象名称(准确说保存引用堆内存空间的地址);
(2)堆内存空间:保存每个对象的具体属性内容;
(3)全局数据区:保存静态属性的内容;
(4)全局代码区:保存所有方法的定义;
#main方法
public class TestDemo {
public static void main(String[] args) {//main方法格式
System.out.println("Hello World");
}
}
public,但是在1.4版本之后main方法已经被强制成了public,在Java里面所有被public修饰的方法,类等都可以在任意其他地方调用。因为一个Java程序在运行时首先创建一个JVM实例,程序要运行需要调用main方法,JVM从外部调用main方法这就需要访问权限修饰符必须给出外部访问的权限,所以只能用public。
static的定义是为了JVM在调用main方法时不用实例化对象,只需要在初始时加载main方法所在类,然后直接通过类名.main来调用main方法。
void表示main方法没有返回值,没有返回值的原因是因为Java不需要main方法向操作系统返回退出信息。如果main方法正常退出,那么Java应用层序的退出代码为0,表示成功的运行了程序。
main的名称不能变是为了JVM能够识别程序运行的起点,main方法可以被重载,重载的main方法不会被执行。main方法作为程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程,非守护线程和守护线程,main方法属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以表明自己的线程是守护线程。当程序中所有的非守护线程终止时,JVM退出。也可以用Runtime类或者System.exit()来退出。
#数组:
数组概念:是一组相关变量的集合。数组属于引用类型,使用前若不开辟空间,会出现NullPointerException。
数组使用:先声明数组,再初始化,用索引操作数组,索引范围为0~数组长度-1。
数组操作:数组通过一个名称来管理,用for循环完成输出,循环次数为“数组名称.length”。
动态初始化:先声明,再开辟空间,后赋值;
格式:数据类型 数组名称 [] = new 数据类型[长度];
格式:数据类型 [] 数组名称 = new 数据类型[长度];
int data[] = null;
data = new int[3];
data[0] = 10;
data[1] = 20;
data[2] = 30;
静态初始化:数组在开辟空间时设置好内容;
简写格式:数据类型 数组名称 [] = {值,值,值,...}; 数据类型 [] 数组名称 = {值,值,值,...};
完整格式:数据类型 数组名称 [] = new 数据类型 []{值,值,值,...}; 数据类型 [] 数组名称 = new 数据类型 []{值,值,值,...};
int scores[3] = {10,11,12};
在实际工作中,如何数组操作? 如果知道所有的操作数据,使用静态初始化比较合适;如果有一些数据需要单独配置,使用动态初始化比较合适;
数组两个常用的操作方法:
(1)数组排序:可以由小到大对基本数据类型的数组进行排序(如int数组,double数组),操作语法java.util.Arrays.sort(数组名称).
(2)数组拷贝:从一个数组中拷贝部分内容到另外一个数组中,操作语法System.arraycopy(原数组名称,原数组开始点,目标数组名称,目标数组开始点,拷贝长度).