Java学习笔记03(持续更新)

本博客用于记录本人Java的学习过程,本人才疏学浅,如有错误,请在评论区指出

Java学习笔记(纯干货)(持续更新):
Java学习笔记01
Java学习笔记02
Java学习笔记04
JDBC技术

下面就开始进行面向对象编程的学习。

3.1 Java中的类

我们在刚开始学习Java时其实就已经接触到了类(class),下面我们详细的介绍类。
类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。

3.1.1 类的创建

Java语法中使用class来创建类。

语法:

修饰符 class 类名{
类的常量定义;
类的属性声明、初始化;
类的方法声明、初始化;
}

例如,

public class Person{
	String name;
	int age;
	public void showName(){
	System.out.print(name);
	}
	public int getAge(){
		return age;
	}
}

3.1.2 类的成员属性

格式:

[修饰符] [static]  数据类型 变量名称 ;

修饰符: 可选项,用于指定访问权限,有 public、protected、private。
static: 可选项,定义的方法为静态方法。若没有则定义的是实例方法。
数据类型: 必选项,java中所有的数据类型都可以。
变量名: 必选项,自己定义的名称。
也可以直接初始化,和前面讲过的一样。

这里详细说一下 public、protected、private 区别。

public: 类内、继承的类和类外都可使用。
protected: 类内和所继承的类内可用,类外不可用。
private: 只有类内可用,继承的类和类外都不可用。
(继承后面会详细说)

3.1.3 类的成员方法

和我们之前讲的方法完全相同。
Java方法只能定义在类内,不能嵌套定义在方法内。
格式:

[修饰符] [static] <方法返回值类型> <方法名> (参数列表) {
	方法体;
}

其中,
修饰符: 可选项,用于指定访问权限,有 public、protected、private。
static: 可选项,定义的方法为静态方法。若没有则定义的是实例方法。
返回值类型: 必选项,用于指定方法的返回值,若无返回值,则用void。
方法名: 必选项,就是自定义方法名(必须合法)。
参数列表: 可选项,指定方法中的参数。有多个时,用逗号隔开。
方法体: 函数的实现部分,用大括号括起来。

3.1.4 类的属性和方法的使用

Java属性和方法有两种:静态和实例(定义时有无static)。
1. 静态
通过类名调用。
调用形式:

类名.属性名;
类名.方法名(实参列表)

在自身类中被调用时,可以省略类名。

需要注意的是,静态方法被定义时,在方法体中不能使用自身的实例属性和实例方法,只能使用自身的静态属性和静态方法。

2. 实例
通过对象名调用。必须先定义对象再使用。
调用形式:

对象名.属性名;
对象名.方法名(参数列表)

Java中还提供了一个 this 对象关键字,表示一个对象实例。当形参和成员变量重名时,必须使用 this ,其他时候可省略。例如,

private int a;
public void setA(int a){
this.a = a;
}

3.1.5 符号常量的定义

常量顾名思义就是不可改变的量,一经定义就不可再改变其值
定义格式:

public static final  数据类型 常量名 = 常量值;

例如:

public static final int N = 100;
public static final double PI = 3.14;

常量命名习惯上所有字母全使用大写的。
在类内可以直接使用,在类外使用 “类名.常量名称” 的方法访问。
例如,

double s = Test.PI * r * r;

3.1.6 类的构造方法

构造方法用来给类中的所有成员变量进行初始化。
格式:

public 类名称(参数列表){
	方法体;
}

构造方法分为两种 带参构造 和 无参构造 。
无参构造我们称为 “默认构造方法”,其方法体可以是空。所以类中的数据都为默认值。

如果没有定义构造方法,系统会自动创建一个无参默认构造方法。
构造方法也可以重载。

3.2 Java中的对象

对象是类的实例。
对象需要创建后才可以使用,而对象的创建需要声明和实例化。

3.2.1 对象的创建与使用

1. 声明
格式:

类名称  对象名称;

2. 实例化
格式:

对象名 = new 类的构造方法(实参列表);

当然,声明和实例化可以同时进行。
格式:

类名称 对象名 = new 类的构造方法(实参列表);

访问格式:

对象名.属性;
对象名.成员方法();

Java可以自动判断对象是否还在使用,能自动销毁不再使用的对象,释放资源。

3.2.2 对象数组

对象数组也是需要先创建后使用。
注意:数组中的每个元素必须是已经创建的对象或者已经赋值的对象。
和前面介绍的数组使用并无差异,这里就不再赘述。

3.3 类的组织管理

一个Java应用程序由多个类构成,为了方便使用,专门提供了 package 语句和 import 语句。

3.3.1 package语句和import语句

包(package)是Java提供的一种区别类的命名空间的机制(相当于文件夹)。
定义格式:

package 包名;

当包中还有子包时,使用 . 来进行指定,例如:

1.2.3

其中 包1为最外层的包,包3为最内层的包。

类可以访问自己所在包中的类,也可以访问其他包中public的类。
访问其他包中的public类时,有两种办法:

1. 使用包名引用
只需要在类名前加上完整的包名就可以。例如,

// 类 Test 储存在 包 a1.b2.c3 中
a1.b2.c3.Test t = new a1.b2.c3.Test();

2. 使用import语句引用
使用包名引用比较繁琐,所以Java提供了 import 语句来引用包中的类。
格式:

import 包名.类名;

例如:

import a1.b2.c3.Test;

亦可以直接引用包中的所有类,包名用*代替就可以。

import a1.b2.c3.*;

还要注意的是,import 语句必须写在 package 语句和类定义之间。

3.3.2 类的封装与访问

这里先说一个之前没有提到过的内容,就是类的定义是不加修饰符(public、private、protected)。即,

class 类名{};

这样的类就被称作友好类,在另外一个类中使用此种类创建对象时,需要满足两个类在同一个包中。

这里再着重说一下访问权限,

访问权限同一个类同一个包中的子类同一包中的非子类不同包中的子类不同包中的非子类
public可以直接访问可以可以可以可以
protected可以直接访问可以可以可以不可以
无修饰符可以直接访问可以可以不可以不可以
private可以直接访问不可以不可以不可以不可以

类中的实例方法可以访问实例属性、实例方法、静态属性和静态方法;但是静态方法只能访问静态属性和静态方法。

3.4 类的继承

类的继承是一种重用已有类来创建新类的机制。
设类A是已经定义的类,在A类的基础上,通过添加新属性、新方法,或者修改A中的方法, 形成一个新类B,则A就是父类,B是子类。即B类时由A类派生的。

3.4.1 子类的创建

1. 创建格式:

[修饰符] class 子类名 extends 父类名{
子类类体;
}

修饰符: 可选项,用于指定访问选项, public、abstract、final。
子类名: 指定子类的名称,一般要求首字母大写。
extends 父类名: 用于指定继承与哪个父类。

如果没有extends 关键字则是继承的Object 类创建的子类。所以说我们之前接触的类都是Object类的直接子类。即一个类可能不是Object类的直接子类,但一定是它的子类。Object 类是Java中唯一一个没有父类的类。

2. 继承原则:

  • 继承父类所有的成员属性。
  • 继承父类除构造方法外的所有成员方法。
  • 子类可以重新定义父类中的成员,称为属性(方法)的覆盖。
  • 类继承并不改变类中属性和成员的访问属性。

子类可以对从父类继承来的 public 、protected 的成员直接访问,不能直接访问使用 private 的成员。但是可以通过使用 public 、protected 的成员间接调用访问。
重新定义父类中的方法,也就是创建了一个同名方法后,如果还想调用父类中的方法,则需要 super 来进行区分。例如,

super.show();

3.4.2 子类的构造方法

子类不能继承父类的构造方法,但是可以在构造方法中使用super调用父类的构造方法。
例如,

public class Person {
	protected String name;
	Person(String name){
		this.name = name;
	}
	public void showName(){
	System.out.println(name);
	}
}
public class Student extends Person {
	private int num;
	Student(String name,int num){
		super(name);
		this.num = num;
	}
	public void showNum() {
		System.out.println(num);
	}
}

3.4.3 子类和父类对象的之间的转换

假设A类是B类的父类,用子类创建一个对象,把这个对象赋值给父类对象时,例如:

A a;
a = new B();
//或者
// A a;
B b = new B();
a = b;

则称这个父对象a是子对象b的“上转型对象”。
特点:

  • 上转型对象不能操作子类新增的成员。
  • 上转型对象可以对子类继承或重写的成员进行访问、调用。
  • 若子类重写了父类的某个方法,当对象的上转型对象调用这个重写方法时,调用的时子类的重写方法。

注意:上转型对象会失去原对象的一些属性和功能。

3.4.4 抽象类

在设计类时,有些方法无法给出具体的实现代码,这种方法被称为“抽象方法”,含有抽象方法的类被称为“抽象类”。
抽象类定义:

格式:

public abstract class 类名{
	属性定义;
	非抽象方法定义;
	抽象方法定义;
}

例如,

public abstract class Test(){
}

抽象方法定义

抽象方法仅有方法头,没有方法体。

定义格式:

public abstract <类型> <方法名>(参数列表);

注意:在定义中,用 ;代替了方法体。

抽象类、抽象方法的使用说明

  • 抽象类必须被继承,不能被直接实例化,只能作为其他类的父类。
  • 抽象方法在子类中必须被重写。
  • 抽象类中可以没有抽象方法,但是包含抽象方法的类必须是抽象类。

抽象类的实现,实际上就是给出一个继承类,对其中的抽象方法进行覆盖。要特别注意,如果创建的子类中,没有全部重写抽象方法,则该子类也为抽象类。

3.4.5 Java接口

Java中的接口是特殊的抽象类,仅含有抽象方法和常量。
定义格式:

[public] interface 接口名 [extends 父接口]{
	//静态常量声明
	public static final 数据类型 常量名 = 常量值;
	//抽象方法声明
	public abstract 返回值 方法名(参数列表);
}

public: 可选项,省略的话使用默认访问权限。
extends 父接口名: 可选项,用于指定继承于哪个接口。

关于静态常量和抽象方法的定义前面都学习过了,这里就不再赘述。

接口可以被继承,而且可以实现多继承,子接口会继承所有的常量和抽象方法。
例如,

public interface  Test extends Test1,Test2{}

利用接口来实现现新类,称为接口的实现。一个类可以实现多个接口,声明时用逗号分隔接口名。

格式:

修饰符 class 类名 [extends 父类名] implements 接口列表{};

其中,继承的部分可写可不写,取决于是否是继承来的。

例如,

public class Test implements A,B{}
public class Test extends Test1 implement A,B{}

3.5 类的多态

多态使编程更加的简单。

3.5.1 基于方法重载

重载同类的方法需要相同的方法名和不同的参数列表。
重载基类的方法:在子类中增加一个与父类重名的方法,且有不同的参数列表。

详细的细节前面都学习过了,就不再赘述。

3.5.2 基于方法覆盖

方法覆盖就是子类中重新定义父类的同名方法,且参数列表也相同,但方法体不同。

详细的细节前面也都学习过了,不再赘述。

3.5.3 向上转型

一个对象可以看作本类类型,也可以看作它的超类类型。取得一个对象的引用并将它看作超类的对象,称为向上转型。
一个父类(接口)的引用变量可以指向不同的子类对象,这个引用变量可以调用子类中的覆盖父类的方法(或者实现接口中的覆盖方法),可以在运行时根据父类(接口)引用变量所指对象的时间类 ixngzhixing 相应的子类的方法,从而实现多态性。

3.6 Java常用类

Java的类库是Java提供的已经实现的标准类的集合,根据实现的功能不同,放到不同的包里。

下面说几个常用的包:

java.lang包
是Java的核心类库,包含了一些必不可少的系统类定义。
为了方便,使用此包下的类不需要使用import语句引入,系统会自动加载。

java.io包
主要包含与输入输出有关的类。

java.util包
提供一些常用的工具类,包括非常重要的集合类库。

java.swing包和java.awt包
提供创建图形界面程序的类。

java.net包
包含与网络编程相关的类库。

java.sql包
包含用来实现数据库编程的类库。

3.6.1 Object类

前面我们提到过,Object 类是Java中所有类的直接或间接父类。所以说Object 类包含了所有Java 类的公共属性和方法,在任何类中都可以直接使用。

主要方法:

public final Class getClass() 
获取当前对象所属类的信息,返回Class对象。

public int hashCode() 
得到用来标志对象的哈希码。
默认情况下,该方法将对象在内存中的地址转化为一个 int 型的整数作为返回值。
没重写该方法时,对象的哈希码都是唯一的。

public boolean equals(Object obj)
这个前面也提到过,就是用来比较两个对象是否相同。
即两个引用是否指向一个对象。

protected Object clone() 
返回对象的一个副本通常需要在子类中重写才能使用。

public String toString() 
以字符串形式返回对象的相关信息。实际应用中应该重写。

protected void finalize() 
定义垃圾回收器回收当前对象时所需完成的清理工作。

3.6.2 基本数据封装类

Java中定义了多种基本数据类型,并提供了相应的封装类。

基本数据类型封装类
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
floatjava.lang.Float
doublejava.lang.Double
booleanjava.lang.Boolean
charjava.lang.Character
longjava.lang.Long

类中定义了对应基本类型的一些常数;提供基本数据类型和字符串的相互转化方法,要注意的是,对象中封装的值是不可改变的。改变对象值的唯一办法是创建一个新的对象,对方法进行重写。

下面以 Inteter 类为例,列出主要属性和方法:

1.常用属性

//返回 int 型数据的最大值
public static final int MAX_VALUE

//返回 int 型数据的最小值
public static final int MIN_VALUE

2.构造方法

//利用整数创建对象
public Integer(int value)

//利用字符串创建对象
public Integer(String s)

3.主要方法

//返回对象的整数值
public int intValue()

//返回对象的浮点数值
public double doubleValue()

//将整数值转化成字符串
public String toString()

//将指定整数转化成字符串
public static String toString(int i)

//将指定字符串转化为整数
public static int toInt(String s)

//利用字符串转化为对象
public static Integer valueOf(String s)

3.6.3 字符串类

字符串我们都很熟悉了,主要有两个类来处理字符串,分别是 java.lang.String 类和 java.lang.StringBuffer 类。

我们先来看 Sting 类

String 类表示字符串常量,一个String对象的字符串内容不能改变。

1.构造方法

//生成空字符串
public String()

//利用已知字符串生成一个字符串对象
public String(String original)

//利用字符数组生成字符串对象
public String(char[] value)

在实际操作中,创建一个Sting对象可以直接使用""来进行赋值

2.成员方法

//返回字符串长度
public int length()

//返回指定位置的字符
public char charAt(int index)

//判断两个字符是否相等(区分大小写)
public boolean equals(Object obj)

//判断两个字符是否相等(不区分大小写)
public boolean equalsIgnoreCase(String anotherString)

//将所有字母转化为小写
public String toLowerCase()

//将所有字母转化为大写
public String toUpperCase()

//按字母顺序进行字符串比较
public int compareTo(String s2)

//从指定位置开始取子串
public String sibstring(int beganIndex)

//从指定位置开始和结束取子串
public String sibstring(int beganIndex,int endIndex)

//返回str在当前串中的开始位置
public int indexOf(string str)

//判断是否以prefix为前缀
public boolean startsWith(String prefix)

//判断是否以suffix为后缀
public boolean endsWith(String suffix)

//将字符串转化为字符数组
public char[] toCharArray()

//去掉字符串首尾空格
public String trim()

//将字符串按照指定分界符分为字符数组
public String[] split(String regex)

还有 StringBuffer

为了弥补 String 类的缺陷,StringBuffer 类允许动态修改字符串的内容。

1.构造方法

//创建空的对象
public StringBuffer()

//设置初始长度,若超过,系统自动增长
public StringBuffer(int length)

//利用已知字符串初始化对象
public StringBuffer(String s)

2.成员方法

//在字符串的尾追加指定字符串
public StringBuffer append(String str)

//在指定位置插入字符串
public StringBuffer insert(int index,String s)

//将字符串中 index 处的字符替换为 c
public void setCharAt(int index,char c)

//将字符串翻转
public StringBuffer reverse()

//用指定字符串替换指定位置的子串
public StringBuffer replace(int start,int end,String str)

3.6.4 System类和Runtime类

1. System类

java.lang.System 类主要提供与系统相关的静态方法和静态对象。
常量:

public static final InputStream	in		//标准输入流
public static final PrintStream	out		//标准输出流
public static final Printstream err		//标准错误输出流

输入输出流我们会在后面详细学习。

静态方法

//终止正在运行的Java虚拟机,参数用作状态码,非0的状态码表示异常终止
public static void exit(in status)

//返回以毫秒为单位的当前运行时间,可以利用该方法计算程序运行时间。
public static long currentTimeMillis()

//用作复制数组,原数组中srcPos到srcPos+length-1之间的数据分别复制到目标数组中的destPos到destPos+length-1之间的位置
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

例如,

public class SystemTest {
	public static void main(String[] args) {

		long timeStart = System.currentTimeMillis);
		String[]s1 = 1 "aaa", "bbb", "сcc", "ddd", "eee", "fff' );
		String[] s2 = new String[6];
		System.arraycopy(s1, 0, s2, о, s1.length);// 将s1内容赋值给s2
		System.out.println("数组的各元素依次为: ");
		for (Strings:s2) {
			System.out.println(s);
		}
		for(long x=1;x<= 500000;++x){int y=0;}
		long timeEnd = System.currentTimeMillis);
		System.out.println("运行时间为J: " + (timeEnd - timeStart));
	}
}

2. Runtime类

Runtime类封装了运行时的环境。每个Java应用程序都有一个 Runtime类实例,使应用程序能够与其运行的环境相连接。一般通过 getRuntime 方法获取当前Runtime运行时对象的引用。

Java虚拟机本身就是Windows上的一个进程, 这个进程可以启动其他的Windows程序,通过这种方式启动的Windows程序实例就称为子进程。

Java虚拟机调用Runtime的exec方法就可以启动这个子进程,其返回值是代表子进程的Process对象。

3.6.5 数学运算类

1. Math类
我们之前学习过Math类,这里就简单说说。

1.常量符号(属性)

public static final double E; //数学常量e
public static final double PI; //圆周率常量

2.静态方法

public static double abs(double i);//求绝对值
public static double sin(double a);//求正弦
public static double log(double a);//求自然对数
public static double max(double a,double b); //求最大值
public static double pow(double a,double b); //求乘幂
public static double random();//产生0~1之间的伪随机数
public static double exp(double a);//求e的a次幂
public static int round(float a);//四舍五入
public static double sqrt(double a)//求平方根

举个例子来加深理解,

public class MathTest {
	public satic void main(String[] args) {
		System.out.pintn("E'的值: "+Math.E);
		System.out.pritn("Pi的值: "+Math.PI);
		System.out. pintn("产生的一一个随机数: "+Math. random());
		System.out.printn("e的指数5.6的值: "+Math.exp(5.6));
		System.out.pintln("5的平方根: " + Math.sqrt(5));
		System.out.println("2的10次幕: " + Math. pow(2, 10);
		System.out.println("100.56的取整: "+Math.round(100.56));
		}
}

2. BigInteger类和 BigDecimal类

Java用这两个类来实现大整数和大实数的运算,下面主要介绍 BigInteger类,BigDecimal类和它类似。

常用属性:

public static final BigInteger ONE;		表示1
public static final BigInteger ZERO;	表示0
public static final BigInteger TEN;		表示10

构造方法:

public BigInteger(String val)		//创建对象(以十进制)

成员方法:

public BigInteger add(BigInteger val)		//加法
public BigInteger subtract(BigInteger val)	//减法
public BigInteger multiply(BigInteger val)	//乘法
public BigInteger divide(BigInteger val)	//除法

public int compareTo(BigInteger val)		
//比较大小,相等返回0,大于返回1,小于返回 -1

下面写一个实例,来加深理解

import java.math.BigInteger;

public class BiglntegerTest {
	public static void main(String[] args) {
		long x = 123456689987654321L;
		long y = 12345679999999L;
		System.out.println("x=" + x);
		System.out.printhn("y-"+ y);
		System.out.println("x*y= "+(x * y));
		BigInteger bigX = new BigInteger("123456789987654321");
		BigInteger bigY = new BigInteger("12345679999999");
		BigInteger bigXY = bigX.multiply(bigY);
		System.out.printn("bigXY= "+ bigXY);
		}
}

3.6.6 日期时间相关类

Java 没有提供日期时间的基本类型,采用类对象来处理日期和时间。

1. Date类

构造方法:

public Date()				// 创建当前时间
public Date(long time)		// 创建指定时间,从1970.1.1 0时开始至今的毫秒数

成员方法:

public long getTime() 	//返回从1970.1.1 0时开始至今的毫秒数
public void setTime(long time)	//设置时间,从1970.1.1 0时开始至今的毫秒数
public boolean before(Date when)	//判断当前时间是否先于之前指定时间
public boolean after(Date when)		//判断当前时间是否迟于之前指定时间

2. Calender类
Date中很多废弃的方法都转移到了Calendar类中,Calendar是一个抽象类, 提供了日期时间对象与诸如年、月、日、星期、小时、分钟、秒等日历分量之间的转换,很多方法的具体实现是由它的一些子类来完成的。

得到Calendar的实例不能使用构造方法,一般使用如下形式:

Calendar calendar = Calendar. getInstance();

表示日历分量的常量

public static final int YEAR	//年份
public static final int MONTH	//月份
public static final int DATE	//天数(月内第几天)
public static final int DAY_ OF_ YEAR	//年内第几天
public static final int DAY_ OF _WEEK	//周内第几天
public static final int HOUR	//小时(. 上午或下午的小时,12 进制)
public static final int HOUR_ _OF DAY	//小时(一天中的小时,24进制)
public static final int MINUTE	//11分钟
public static final int SECOND	//秒

2.成员方法

public static Calendar getInstance() 
//基于当前时间获得Calendar 实例

public final void set(int year,int month,int date)
//设置年月日, 月份范围0~11,代表1至12月

public final void set(int year,int month,int date,int hourOfDay,int minute) 
//设置年 月 日 小时 分钟

public final Date getTime() 
//获得 Calendar实例对应的Date对象

public final void setTime(Date date) 
//使 用Date实例初始化Calendar对象

public int get(int field) 
//获得 Calendar实例对应的分量,field 的取值为Calendar常量
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值