目录
一、java类及类的成员:属性、方法、构造器;代码块、内部类
二、面向对象的三大特征:封装性、继承性、多态性 、(抽象性)
三、其他关键字:this、super、static、final、abstract、interface
十五、项目二 做一个顾客管理系统 涉及增删改查(放数组里)编辑
一、java类及类的成员:属性、方法、构造器;代码块、内部类
二、面向对象的三大特征:封装性、继承性、多态性 、(抽象性)
1.类和对象
类是抽象的定义:人
对象是实例:小明
2.设计类就是设计类的成员:属性、方法、构造器;代码块、内部类;
属性 = 成员变量= field = 域、字段
方法 = 成员方法 = 函数 = method
创建累的对象= 类的实例化
3。赋值的时候要注意赋的是值还是地址
4.对象的内存解析
三、其他关键字:this、super、static、final、abstract、interface
注意看p3 = p1这一块,这就是为什么在链表题里ListNode cur = root,针对cur进行一系列操作后返回root就是要的结果,因为他俩就是一个地址
方法的使用中,既可以调用属性,也可以调用类中的方法
特殊:方法a中调用方法a,递归
虚拟机栈(栈):局部变量放在栈里
堆:new出来的结构都放在堆空间,包括数组、对象。对象的属性(非static)放在堆里
方法区:类的加载信息,常量池和静态域
四、内存解析说明
引用类型的变量,只可能储存两类值:null或地址值(含变量的类型)
五、匿名对象的使用
1.创建的对象没有显式的赋给谁
new Person().showname() 不指定new给谁,每次new都是新的对象
2.只能调用一次
3.使用:就好比
result.add( new ArrayList(path))
4.线性查找会返回第一次出现的位置
六、重载
在同一个类中,方法名可以重复,只要形参不一样(个数、类型)就行,想一下ListNode 紧抓定义,和权限修饰符,返回类型,方法体都无关
public newNode(int _val) {
val = _val;
}
public newNode(int _val, newNode _left, newNode _right, newNode _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
七、可变个数形参的方法
允许定义能和多个实参相匹配的形参,用于传递个数可变的实参(可以用在SQL语句里)
当调用可变个数形参的方法时,传入的参数个数可以是0,1,。。,n
当形参中出现数组时,有可变个数形参的方法时会报错,因为他俩干的活是一样的
person.show("Rom");
person.show("Tom","Jatty");
person.show();
public void show(String ... str){
}
可变个数形参在方法的形参中必须声明在末尾,并且只能有一个可变个数形参
public void show(int i,String ... str){ }
八、方法参数的值传递机制
1.对于引用数据类型里面放的是地址
解释了为什么链表题里ListNode cur = root,对cur做操作root会有变化,因为他们指向同一个实体
2.方法形参的传递机制:值传递
形参 实参
值传递机制:如果参数是基本数据类型,此时实参付给形参的是变量保存的数据值,所以执行 交换 方法实际上并没有完成交换操作
如果参数是引用数据类型,此时实参付给形参的变量保存的数据的地址值,所以执行 交换 方法实际上并没有完成交换操
但如果是引用数据类型,就可以想要的执行结果 还是以交换为例
public static void main(String[] args) {
Datas data = new Datas();
data.m = 10;
data.m = 20;
swap(data);
}
static void swap(Datas data) {
int temp = data.m;
data.m = data.n;
data.n = temp;
}
static class Datas {
int m;
int n;
}
解释了之前刷题的时候 写的一个方法拿类的属性直接做形参,最后执行的操作没执行成功,最后要把形参改成类
九、封装和隐藏
高内聚、低耦合:
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅对外暴露少量的方法用于使用
1、问题引入:
当我们创建一个类的对象以后,我们可以通过对象.属性方法对对象的属性进行赋值、这里赋值操作收到属性的数据类型和存数范围约束。
在实际问题时,往往需要给属性赋值添加限制条件,此时就需要写一个方法来添加限制条件。比如set()。为了避免用户还是用属性.方法完成赋值,就要把这个属性声明为private。体现封装性
2、封装性的体现
将类的属性设置为private时,同时提供public的方法完成属性的set 或get
拓展:封装性的体现:①如上 ②构造类内部使用的方法 private③单例模式
3.封装性的体现需要权限修饰符的配合
(1)四类权限:private、缺省(啥也不写)、protected、public
不同包的子类:涉及继承性
(2)四类权限修饰符能够修饰类及类的内部结构:属性、方法、构造器和内部类
修饰类的话只能用缺省和Public
用四种权限修饰符修饰类及其内部结构,体现类和类的的内部结构在调用时可见性的大小
十、类的成员之三构造器(构造方法) 前两个是属性和方法
1、构造器的作用:创建对象
new + 构造器
1.如果没有显式定义构造器,系统会默认提供一个空参构造器(权限和类一样)
2.定义构造器的格式,权限修饰符 构造器名称(和类同名) (形参类别){} 举例如下
public class newNode {
public int val;
public newNode() {
}
public newNode(int _val) {
val = _val;
}
newNode node = new newNode(1);
构造器的形参可以用来给属性赋初始值
3.一个类中构造的多个构造器,彼此之间是重载
4.一旦显式定义尅的构造器,系统就不会提供默认的空参的构造器
十一、属性的赋值顺序:
说真的 我觉得这个给语句执行顺序有关 1,2就不说了,3是定义了属性才能在构造器里对属性进行赋值,通过.进行赋值肯定是你new过对象之后才能调对象的属性或者方法
1.隐式赋值(在类里面属性用数据类型的默认值)
2.显式赋值(在类里面对属性进行赋值)
3.构造器中赋值
4通过对象.属性、对象.方法 进行赋值
十二、JavaBean![](https://i-blog.csdnimg.cn/blog_migrate/9e959a790eb1ff17ba9346d330fae397.png)
十三、this的使用
在类中方法的形参和属性重名时,可以用this.进行区分
this可以用来修饰属性、方法、构造器
1.this可以修饰属性和方法:
理解为当前对象
newNode node = new newNode(1);
public newNode() {
}
public newNode(int val) {
this.val = val;
}
this可以理解为node (谁调这个方法,这个就是谁的属性)n
1.1.在类的方法中,可以使用“this.属性”或“this.属性”的方式,调用当前对象的属性和方法,但一般都省略了
如果方法形参和类的属性同名时,必须显式的使用“this.变量”表示此变量是属性而不是形参
1.2.在类的构造器中,可以使用“this.属性”或“this.属性”的方式,调用当前对象的属性和方法,但一般都省略了
如果方法形参和类的属性同名时,必须显式的使用“this.变量”表示此变量是属性而不是形参
1.3.this调用构造器
一般会有好几个形参不同的构造器,但每个构造器中执行的操作类似。那么可以使用this调用本类中指定的构造器
格式:直接在构造器里写 this(如果你想执行的构造器里要形参 这个地方放形参);
不能自己调自己,也不能调成一个环路
调用构造器的时候要写在构造器里面最前面,不能一次调好几个构造器
public Person(){
}
public Person(int age){
this();
this.age = age;
}
public Person(String name,int age){
this(age);
}
十四、package 、import的使用
1.package:包
为了更好的实现项目中类的管理,提供包的概念
1.2.使用package声明类或接口的包,声明在源文件的首行
1.3.包,属于标识符,遵循标识符的命名规则、规范(小写)“见名知意”
1.4.每“.”一次,代表一层文件目录
同一个包不能命名同名的接口和类,不同的包不管
2.import 导入
2.1在源文件中显式使用import结构导入指定包下的类、接口
2.2声明在包的声明和类的声明之间
2.3两个包里有相同名称的类时怎么引用?
在创建对象的时候加包名:至少有一个对象要这样式写
com.demo.TreeNode treeNode = new com.demo.TreeNode();
2.4 xxx.*只能导类和接口,如果有子包,改导还得导
2.5 import static 导入指定类或接口中的静态结构。然后在代码里就不用加他的名字了