1.类:
首先类是什么,我们假设有一台汽车,我们可以用原生类型int或者float来描述它的高度,长度,重量等,但是汽车的性能,汽车的安全性,我们用原生类型int或者float是无法描述的,所以我们选择创建一个新的类型来描述它的安全性或者它的性能,我们在定义类的时候,需要用到一个关键字class,每写一个class都是在定义一个新的数据类型,这个新的数据类型就叫做类(Type)
在类中我们要提供事物的共性,这些共性分为两类
共性特征(属性)
共性行为(方法)
2.设计类:
假如我们要设计学生这个类,首先我们要知道属性是什么,比如这个学生的身高,体重,年龄,性别这些就是属性,那行为呢,学生的学习,学生的吃饭,学生的睡觉就是行为,这里我们刚开始可以先画图,画出类的结构图(UML),可以在processon里面有固定的模板画
里面的Student就是类名,stuId就是类的属性,learn就是类的方法
3.创建对象:
比如我们之前用过的Scanner scan = new Scanner(System.in);就是一个创建对象非常好的例子,可以把他看成 int i = 0; int就是Scanner(数据类型), i就是scan(引用变量), new Scanner(System.in)就是一个对象.
4.对象的内存管理:
对于内存,个人浅薄理解只需要知道三个地方,虚拟机栈(Stark),堆(heap),方法区.
所以我一般会把内存简化成三篇区域:栈,堆,代码区
储存结构大小 堆>栈>寄存器 存储结构执行速度 寄存器>栈>堆
栈里面只有2类内容
- 原生类型 : 直接保存类型的值
- 引用变量(就是我们前面提到过的scan) : 保存堆中对象的地址
堆中有两个内容
- 所有new出来的
- 常量池
我们所有对对象的操作都是通过引用变量来完成的!~>
5.构造方法的定义:
每个类中都默认拥有一个隐藏的方法,这个方法没有返回值,且方法名和类名一致。具备这两点特性的方法被叫做构造方法。每个类默认都拥有一个无参且隐藏的构造方法,比如你创造了一个Teacher的方法,但是你的代码块里什么都不写,他也还是可以被调用,这是为什么呢,因为构造器!!!!!!!!构造器的作用:
- 用于给成员变量赋值(成员变量是定义在方法外的变量)
- 没有参数传入,那就赋予类型的默认值(无参构造方法)
- 有参数传入,赋予传入的值
- 和new 连体,来构造对象!
6.方法重载
重载就是在同一个类中,有多个方法,方法名称一致,但是参数列表不同,就叫做方法的重载
其中有一个重点就是就近原则!!!!
比如你创造了一个student的方法,之后在同一个类中又创建了一个student的方法,但是参数列表不同,这就是重载,但是某些参数是相同的,如果我调用这个方法,返回的值要确定是你新创建的方法的值怎么办,用到关键字this,因为Java的解释器在寻找变量的时候就遵守就近原则
public class Student {
public int stuId;
public int stuAge;
public String stuGender;
public String stuName;
public Student(){
System.out.println("this is student constructor");
}
public Student(int stuId,int stuAge,String stuName,String stuGender){
this.stuId = stuId;
this.stuAge = stuAge;
this.stuName = stuName;
this.stuGender = stuGender;
System.out.println("this is student constructor");
}
重载有几种方式呢,有以下几种,参数数量的改变,参数类型的改变,(参数数量>=2 && 两种类型不一致时),改变顺序也可以重载,注意前提!!!
public class A {
public void method() {
System.out.println("this is method");
}
//-- 和上面相比,参数数量改变
public void method(int i) {
System.out.println("this is method");
}
//-- 变量名不影响重载,只受数量和类型的限制
//public void method(int j){
// System.out.println("this is method");
//}
//-- 和第8行相比 参数数量改变
public void method(int i, int j) {
System.out.println("this is method");
}
//-- 顺序颠倒,类型一致,本质就是名字改变,不影响重载
//public void method(int j,int i){
// System.out.println("this is method");
//}
//-- 和上面相比是参数类型改变
public void method(int i, double j) {
System.out.println("this is method");
}
//-- 和上面相比 参数数量>=2,且类型不一致,顺序发生改变,
public void method(double j, int i) {
System.out.println("this is method");
}
}
重载在编译时就可以明确方法体,所以也被叫做静态多态。
7.封装:
Java针对类的访问做了权限控制,通过4个访问修饰符来实现
- public
- protected
- private
- 默认(什么都不写,也被佳作friendly或者default)
Student中有四个成员变量,都是被public修饰的,可以理解为在任何一个地方都可以被访问。那这样对于数据而言是不安全的。所以我们希望降低不安全因素。让访问在我们可控制的范围内进行,类似于银行卡密码只有你知道.
Java中进行封装的步骤
- 将访问修饰符降低到private
- 数据的操作说到底无非就是读和写,针对数据提供读和写的方法。大家一般习惯性用如下两个方法
- get 用于取值 代表读
- set 用于赋值 代表写
-
private int stuId; //-- get读取 把数据从内部向外部传递。能够做到这一点的 只有return public int getStuId(){ return stuId; } //-- set赋值 把数据从外部向内部传递。 一个方法接收外部传入数据的地方叫做参数 public void setStuId(int stuId){ //-- 利用条件对传进来的数据做控制!! if (stuId < 0) { System.out.println("stuId不合法"); return; } this.stuId = stuId; }
封装就是属性私有化,简单来说我让你看到什么,你就只能看到什么