Java学习笔记

目录:

基本数据类型

内置数据类型

引用数据类型

类型转换

自动类型转换

强制类型转换

隐含强制类型转换

变量类型

局部变量 

实例变量/成员变量

静态变量/类变量

参数变量

修饰符

访问修饰符

非访问修饰符

运算符 instanceof

For-Each 循环/增强 for 循环 

数组

声明:

创建:使用 new 操作符 (给声明的数组分配空间)

继承

extends

implements

其他关键字

多态性

重写

重载

多态存在的三个必要条件:继承、重写、父类引用指向子类对象

多态的实现方式:重写/接口/抽象类和抽象方法

抽象类

定义:abstract class

抽象方法

封装

接口

特性

接口与类的区别

实现

标记接口

枚举

定义

使用

相关方法:values(), ordinal(), valueOf()

枚举类成员

泛型

泛型方法

泛型类

类型通配符


关于环境

JDK:用于开发和运行Java程序,包含

JRE(Java Runtime Environmet):运行Java程序的程序

配置环境变量

加入系统变量

在path中添加

        以找到编译器和

Java中,通常的做法是创建一个类,然后在类中定义变量、方法以及可能包括的主函数(在java中是程序的执行入口,必须在类中定义)。为了能运行java程序,必须包含 main 方法并且创建一个实例对象(可选,需要调用非静态方法或访问非静态字段时则必须创建一个类的实例)

public class HelloWorld
{
    public static void main(String[] args)  //命令行参数,若要使用需要设置其值
    {
        System.out.println("Hello World!"); //out是在System类中预定义的静态对象
    }
}

class A = new class();   //Java中,使用关键字 new 来创建一个新的对象

函数格式:

import:提供一个合理的路径,使得编译器可以找到某个类(载入)

基本数据类型

内置数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型:byte、short、int、long / float、double / char / boolean

引用数据类型

  • Java中,引用类型的变量类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,一旦声明后,类型就不能被改变了。
  • 对象、数组都是引用数据类型。
  • 所有引用类型的默认值都是null。
  • 一个引用变量可以用来引用任何与之兼容的类型。

类型转换

自动类型转换

运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级(小范围可隐式转换为大范围)。

注:int字面值可以赋值给byte/short数据类型(溢出部分从左侧开始计)

强制类型转换

格式:(type)value type  【转换的数据类型必须兼容】

隐含强制类型转换

  • 整数的默认类型是 int

  • 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或 f

变量类型

局部变量 

在方法、构造函数或块内部声明的变量,在声明的方法、构造函数或块执行结束后被销毁。

声明时需初始化。

实例变量/成员变量

类中声明,但在方法、构造函数或块之外,可以声明在使用前或者使用后,属于类的实例(在对象创建的时候创建,在对象被销毁的时候销毁),每个类的实例都有自己的副本。

可被访问修饰符修饰。

如果不明确初始化,实例变量会被赋予默认值

静态变量/类变量

在类中用static关键字声明的变量,属于类而不是实例,所有该类的实例共享同一个类变量的值。(静态变量是与类相关的变量,具有唯一性和共享性,可用于存储整个程序都需要使用的数据)

生命周期与程序的生命周期一样长。

访问修饰符可以是 public、protected、private 或者默认的访问修饰符。

在类加载时被初始化,而且只初始化一次。

与常量的区别:

常量也是与类相关的,但它是用 final 关键字修饰的变量,一旦被赋值就不能再修改。

常量在编译时就已经确定了它的值,而静态变量的值可以在运行时改变。

参数变量

方法或构造函数声明中的变量,用于接收调用该方法或构造函数时传递的值,作用域只限于方法内部。

参数变量值的传递方式:

  1. 值传递:传递的是实际参数的值的副本
  2. 引用传递:传递的是实际参数的引用(即内存地址),当参数变量被赋新值时会修改原始值

修饰符

访问修饰符

  • default (即默认,什么也不写): 在同一包(组织java文件的文件夹)内可见,不使用任何修饰符。

       使用对象:类、接口、变量、方法

  • private : 在同一类内可见。

       使用对象:变量、方法。 注:不能修饰类(外部类)和接口

  • public : 对所有类可见。

       使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。(子类与基类不在同一包中时子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。)

       使用对象:变量、方法。 注:不能修饰类(外部类)和接口

  继承规则:

  • 父类中声明为 public 的方法在子类中也必须为 public。

  • 父类中声明为 protected 的方法在子类中声明为 protected 或 public,不能声明为 private。

  • 父类中声明为 private 的方法,不能够被子类继承。

非访问修饰符

  • static:修饰方法或变量。(静态变量与方法可直接通过类名来调用)
  • final:修饰类、方法和变量,final 修饰的类不能被继承、修饰的方法不能被继承类重新定义、修饰的变量为常量故不可修改。
  • abstract:创建抽象类和抽象方法。
  • synchronized、volatile:主要用于线程的编程。

运算符 instanceof

用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

如果运算符左侧变量所指的对象,是操作符右侧类或接口的一个对象,则结果为真。若被比较的对象兼容于右侧类型,该运算符仍然返回 true。

使用格式:

( Object reference variable ) instanceof  (class/interface type)

For-Each 循环/增强 for 循环 

一种主要用于数组的增强型 for 循环。(局部变量的值为数组的循环)

格式

for(声明语句 : 表达式)

{

        //代码句子

}

e.g.

for(type element: array)
{
    System.out.println(element);
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。

表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

数组

声明:

T[ ] array;   // 首选的方法,作为函数的参数时也采用这种方式

T array[ ];   // 效果相同,但不是首选方法

创建:使用 new 操作符 (给声明的数组分配空间)

array = new T[Size];

 声明与创建:

T[ ] array = new T[Size];

T[ ] arrayr = {value0, value1, ..., valueN}; 

 数组作为函数的返回值:

return array;  //返回数组名即可

继承

继承关键字: extendsimplements (所有类都继承于 java.lang.Object,该类在 java.lang 包中,所以不需要使用 import)

与C++继承的区别:Java中类只能单继承,但可以多重继承

extends

只能继承一个类。

implements

可变相地使 java 具有多继承的特性,使用范围为类继承接口的情况,即类可以同时继承多个接口(接口与接口间用“  ,”分隔)。

其他关键字

super :可通过 super 关键字来实现对父类成员的访问,用来引用当前对象的父类。当需要在子类中调用父类的被重写方法时,要使用 super 关键字。

this :指向自己的引用,引用当前对象,即它所在的方法或构造函数所属的对象实例。

final:可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。【使用 final 关键字声明类,就是把类定义为最终类,不能被继承,但其中的属性、方法不是 final 的;用于修饰方法,即该方法不能被子类重写】

注:

如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;

如果父类的构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

多态性

多态性是对象多种表现形式的体现。(同一个事件发生在不同的对象上会产生不同的结果)


重写

子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,并且子类方法的实现覆盖了父类方法的实现。


重载

在一个类里面,方法名字相同而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。


重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。


多态存在的三个必要条件:继承、重写、父类引用指向子类对象

多态的实现方式:重写/接口/抽象类和抽象方法

抽象类

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承才能被使用

在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

定义:abstract class

抽象方法

该方法的具体实现由它的子类确定。

Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。


封装

实现Java封装的步骤:

1. 修改属性的可见性来限制对属性的访问(一般限制为private)

2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问(可采用 this 关键字解决同名冲突)

接口

一个抽象类型,是抽象方法的集合,通常以 interface 来声明。

访问修饰符 interface 接口名

{

        //字段

        //抽象方法

}

一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口不是类,类描述对象的属性和方法,接口则包含类要实现的方法。

接口无法被实例化,但可以被实现。

一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

接口类型可用来声明一个变量,他们可成为一个空指针,或是被绑定在一个以此接口实现的对象。

特性

  • 接口是隐式抽象的,接口中的每个方法也是隐式抽象的,即会被隐式的指定为 abstract 。
  • 接口中的方法都是公有的。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public)。
  • 接口中的方法不能在接口中实现,只能由实现接口的类来实现。

接口与类的区别

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法,Java 8之后接口中可以使用 default 修饰的非抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。

访问修饰符 class 类名 implements 接口名

{

        //字段与方法

}

注:

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口(同样使用extends关键字),并且可以多继承(Java中的类只能单继承)。

标记接口

没有任何方法和属性的接口。仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

用途:

  1. 建立一个公共父接口
  2. 向一个类添加数据类型:实现标记接口的类不需要定义任何接口方法,但能通过多态性变成一个接口类型。

枚举

一个特殊的类,一般表示一组常量。

定义

使用enum 关键字,无需加 class

使用

//声明在类外

enum Color
{
    RED, GREEN, BLUE;   //一组对象
}
public class Test
{
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

//声明在类内

public class Test
{
    enum Color
    {
        RED, GREEN, BLUE;
    }
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

注:

  • 每个枚举都是通过 class 在内部实现的,且所有的枚举值都是 public static final
  • 枚举元素可在 for 循环中迭代(类数组),也可用于 switch 语句中

enum Color
{
    RED, GREEN, BLUE;  //一组对象
}


public class MyClass 

{
          public static void main(String[] args) 

        {

                //for循环

                for ( Color myVar : Color.values() ) 

               {
                        System.out.println(myVar);
                }

                //switch语句

                 Color myVar = Color.BLUE;
                 switch(myVar) 

                {
                      case RED:System.out.println("红色");break;
                      case GREEN:System.out.println("绿色");break;
                      case BLUE:System.out.println("蓝色");break;
                }
        }
}

相关方法:values(), ordinal(), valueOf()

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  • values() :返回枚举类中所有的值。
  • ordinal():找到每个枚举常量的索引,就像数组索引。
  • valueOf():根据枚举常量的名称获取对应的枚举对象。

枚举类成员

跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 作为访问修饰符,所以外部无法调用。

枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。

作用:

  1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

  2. 避免命名冲突。包采用了树形目录的存储方式,同一个包中的类名字不同,不同包中的类的名字可以相同,当同时调用两个不同包中相同类名的类时,应加上包名加以区别。

  3. 限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

语法格式

package pkg1.pkg2.pkg3…;

//如果一个源文件开头没有使用包声明,那么其中的类、函数、枚举、注释等将被放在一个无名的包(unnamed package)中

import pkg1.pkg2.classname(.*);

//可以用 import 在源文件头部(package语句后,即包声明之前类声明之后)导入其他包中的类、接口或静态成员,若想使用的是本包中的另一个类可以省略该包名

//可以使用通配符 * 来引入包中的所有类:import com.runoob.mypackage.*;

一些 Java 中的包:

  • java.lang - 打包基础的类
  • java.io - 包含输入输出功能的函数

泛型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

泛型方法

泛型方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。(类似于抽象函数)

定义规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号<>分隔),该类型参数声明部分在函数返回类型前。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像 int、double、char 等)

泛型标记符

 

泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。

一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

类型通配符

一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑上是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值