1.JRE和JDK和JVM
概念:
- JRE(Java Runtime Environment):Java 运行环境,包括 JVM 和运行 Java 程序所需要的核心类库 (Java API类)等。如果你只需要运行 Java 程序,那么安装 JRE 就足够了。
- JDK(Java Development Kit):Java 开发工具包,除包含 JRE 以外,还额外包含了编译 Java 源码的编译器javac,还有很多用于 Java 开发和调试的工具,比如jvisualvm, javadoc, jar等等。如果你需要编写 Java 程序,那么你需要安装 JDK。
- JVM(Java Virtual Machine):Java 虚拟机,是 Java 程序的运行环境,是 JRE 的一部分。JVM 负责将 Java 字节码转换为本地机器码执行。通过 JVM,Java 程序可以在任何支持 Java 的平台上运行,这也是 "Write Once, Run Anywhere" 的基础。
作用:
- 编写代码时会用到 JRE中已经写好的java代码
- 编译代码时会用到 JDK中的编译工具
- 运行代码时会用到 JDK中的运行工具
- 代码运行在JVM中
关系:
2. 数据类型
计算机存储设备的最小信息单位是bit(位),而最小存储单元叫byte(字节)。
数据类型的转换:
隐式转换:把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量,小到大
细节:
- 小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
- byte short char 三种数据在运算的时候,不管是否有更高的数据类型,
- 都会提升为int,然后再进行运算
3.数组
//定义二位数组, 三行四列的空间, 需要有二个下标来表达
int[][] arr = new int[4][5];
arr.length 为二维数组的行大小
arr[i].length为二维数组这一行对应的列大小
数组属于引用类,在方法中改变数组的值,也同样会改变此数组的内容,无需返回值来改变
4.static静态方法
静态方法无法直接调用非静态方法
方法所以在的类 名称 = new 方法所以在的类();
名称.方法名();
调用方法,调用属性
静态先进入内存,压栈中,非静态后调入内存
5.面向对象
概念:
目前只靠自己还无法说清楚,引用别人的:面向对象就是把现实问题抽象为对象,通过调用每个对象的属性或功能去解决问题。
特征:
-
封装 (Encapsulation):面向对象编程通常通过数据和行为(方法)的组合来建立对象,该对象内部的数据和方法的具体实现细节对外部是不可见的。
-
继承 (Inheritance):面向对象编程允许创建从其他类继承特性和行为的新类。
-
多态 (Polymorphism):多态让我们能够在一个类结构中使用多个类型的对象,这极大地增加了程序的灵活性。
6.类与对象
关系:
- 类是对象的模板
- 对象是类的实例
7.类的定义
public class 类名{
//定义属性部分
属性1的类型 属性1;
属性2的类型 属性2;
…
//定义方法部分
方法1;
方法2;
…
方法m;
}
注意类名的规范:
- 类名的第一个字母大写
- 类名尽量使用字母
- 类名要见名知意
- 不要使用关键字
8.属性
属性就是类的静态特征
语法:
[访问修饰符] 数据类型 属性名;
属性名就是属性的名称,属性名第一个字母小写,尽量使用字母,取得名字要有意义
属性是有初始值的,特别注意我们前面讲变量的时候,说我们的局部变量在定义的时候是没有初始值的,需要我们手动赋初始值的.这是局部变量与属性的区别.
成员变量 类型初始值 Byte 0 Short 0 Int 0 long 0L float 0.0F double 0.0D char \u0000(表示为空) boolean false String,其他类类型 Null
9.对象
语法:
对象名 = new 类名();
局部变量是保存在内存的栈中,而new出来的东西是保存在堆中.
Person p1 = new Person();
p1是保存在栈中,而且保存的是new Person在堆中的一个地址码,而new Person()是保存在堆中.
调用属性和方法
-
调用属性: 对象名.属性名
-
调用方法: 对象名.方法名()
10.构造方法-构造函数的定义与作用
创建对象时,必须执行调用到 new 类名(),其实new后面的类名()也是一个方法,它是一个特殊的方法,我们把它称之为构造方法.
类中没有写这样一个方法,java虚拟机会帮你创建一个空的构造方法,格式如下:
public 类名(){
}
特点:
- 它具有与类相同的名称;
- 它不含返回值;
- 它不能在方法中用return 语句返回一个值
作用:
构造方法在程序设计中非常有用,它可以为类的成员变量进行初始化工作
当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用
11.构造方法的重载
格式:
public 类名(参数列表){
}
重载构造方法可以完成不同初始化的操作
12.this关键字
this关键字主要有三个应用:
- this调用本类中的属性,也就是类中的成员变量;
- this调用本类中的其他方法;
- this调用本类中的其他构造方法,调用时要放在构造方法的首行。
public class Student {
String name; // 定义一个成员变量name
public void setName(String name) { // 定义一个参数(局部变量)name
//这个this一定不能省略
this.name = name; // 将局部变量的值传递给成员变量
}
public void fun(){
//这个this可以省略,可以写成 setName(“张三”);
this.setName("张三"); //调用setName()的方法
}
}
this这个关键字其代表的就是对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。
13.static 关键字
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
tatic对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表…)
类名.静态变量名
14.static变量与静态方法
一种是被static修饰的变量,叫静态变量或类变量;全局访问
另一种是没有被static修饰的变量,叫实例变量
静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员方法),只能访问所属类的静态成员变量和成员方法。
静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。
静态是堆内存
new 对象();也是堆内存
15.静态代码块
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
public class TestStatic {
//定义一个静态代码块
static{
System.out.println("这是一个静态代码块");
}
//构造方法
public TestStatic(){
System.out.println("这是构造方法");
}
public static void main(String[] args) {
TestStatic t1 = new TestStatic();
TestStatic t2 = new TestStatic();
}
}
这是一个静态代码块
这是构造方法
这是构造方法
16.封装,继承
封装
封装是 JAVA 面向对象的特点的表现,封装是一种信息隐蔽技术。它有两个含义:即把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位;以及尽可能隐藏对象的内部结构。
封装提高了产品的易用性、安全性
封装的功能:
隐藏对象的实现细节
封装迫使用户通过指定方法访问数据能保护对象的数据不被误修改
使代码更好维护, 使对象的重用变得更简单
java中封装的实现
Java通过三个关键字来控制对象的成员的外部可见性 public, private, protected。
public: 该成员外部可见,即该成员为接口的一部分
private: 该成员外部不可见,只能用于内部使用,无法从外部访问。
protected:该成员外部可见,主要对其子类
使用get(),set()方法对属性进行修改与使用
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从 父类继承方法,使得子类具有父类相同的行为。
类的继承格式
class 子类 extends 父类 {
}
public class Person(){
}
public class Student extends Person(){
}
注意:
在 java 中只允许单继承,而不允许多重继承,也就是说一个子类只能有一 个父类,但是 java 中却允许多层继承.
多层继承:
class A {
}
class B extends A {
}
class C extends B {
}
由上面可以发现类 B 继承了类 A,而类 C 又继承了类 B,也就是说 类 B 是类 A 的子类,而类 C 则是类 A 的孙子类。我们java的所有类都有一个祖先类,就是我们的Object类.
关于子类对父类构造器使用的总结
继承条件下构造方法的调用规则如下:
-
如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。
-
如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。
-
如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
-
特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
this关键字与super关键字,在子类的构造器中只能其中使用一个
super 关键字
super 主要的功能是完成子类调用父类中的内容,也就是调用父类中的属性或方法.
用 super 调用父类中的构造方法,只能放在程序的第一行。
super 关键字不仅可以调用父类中的构造方法,也可以调用父类中的属性或方法,
super.父类中的属性 ;
super.父类中的方法() ;
总结:
子类拥有父类非private的属性,方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
访问修饰符
Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别:
(1)public
: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;
(2)protected
: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问,protected重点突出继承;
(3)default
: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默
认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包;
(4)private
: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。
访问级别 | 访问控制修饰符 | 同类 | 同包不同子类 | 同包子类 | 不同包不是子类 | 不同包子类 |
---|---|---|---|---|---|---|
公开 | public | √ | √ | √ | √ | √ |
受保护 | protected | √ | √ | √ | √ | |
默认 | 没有访问控制修饰符 | √ | √ | √ | ||
私有 | private | √ |
注意:
protected修饰符的修饰的成员变量和方法也称为受保护的成员变量和方法, 受保护的成员变量和方法可以在本类或同一个包中的其它类(包括子类)中通过类的实例进行访问,也可以被同一个包中的类或不同包中的类继承,但是不能在不同包中的其它类(包括子类)中通过类的实例进行访问。