48.二维数组动态初始化
格式:数据类型[][] 数组名=new 数据类型[m][n];
m指这个二维数组,可以存放多少个一维数组,n指每一个一维数组,可以存放多少个元素
特殊情况:int [][] arr=new int [有实参][];(可自行定义一维数组的长度)
49.面向对象
学习获取已有对象并使用;学习如何自己设计对象并使用(面向对象的语法)
50.类和对象
- 类(设计图):是对象共同特征的描述;
- 对象:是真实存在的具体东西。
在Java中,必须先设计类,才能获得对象。
定义:
public class 类名{
成员变量(代表属性,一般是名词)
成员方法(代表行为,一般是动词)
构造器
代码块
内部类
}
得到类的对象:类名 对象名=new类名();
使用对象:访问属性:对象名.成员变量
访问行为:对象名.方法名( ... )
51.定义类
- 用来描述一类事物的类,专业叫做:Javabean类,不写main方法;
- 编写main方法的类,叫做测试类,可以创建javabean类的对象并进行赋值调用。
类名首字母建议大写,需要见名知意,驼峰模式;一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名,但建议一个文件定义一个class类。
成员变量的完整定义格式:修饰符 数据类型 变量名称=初始化值;(一般无需指定初始化值,存在默认值)
52.竖行修改
鼠标滚轮拖动选中,修改;或者alt+鼠标左键
53.封装
对象代表什么,就得封装对应的数据,并提供数据对应的行为
54.private关键字
是一个权限修饰符,可以修饰成员(成员变量和成员方法),被private修饰(私有化)的成员只能在本类中才能访问,对于每一个私有化的成员变量,都要提供get和set方法,方法用public修饰
- set方法:给成员变量赋值
- get方法:对外提供成员变量的值
55.this关键字(就近原则)
this的作用:区分局部变量和成员变量
this的本质:所在方法调用者的地址值
- 成员变量:定义在方法外,类里面的变量,有默认初始化值,位于堆内存的对象,随着对象的创建而存在,随着对象的消失而消失,在整个类中有效;
- 局部变量:定义在方法里的变量,没有初始化值,使用前需要赋值,位于栈内存的方法,随着方法的调用而存在,随着方法的运行结束而消失,在当前方法中有效。
当变量名相同时,优先调用局部变量,需要越过局部变量调用成员变量时,(格式:this.变量名)
56.构造方法
又叫作构造器、构造函数,作用是在创建对象时,由虚拟机自动调用,给成员变量进行初始化。
格式:
public class Student {
修饰符 类名(参数){
方法体;
}
}
- 特点:方法名与类名相同,大小写也要一致;
- 没有返回值类型,连void都没有;
- 没有具体的返回值(不能由retrun带回结果数据)。
执行时机:
创建对象的时候由虚拟机调用,不能手动调用构造方法;
每创建一次对象,就会调用一次构造方法。
构造方法的重载(方法名相同,参数不同):
- 无参数(空参)构造方法:初始化的对象时,成员变量的数据均采用默认值;
- 有参数(带参)构造方法:在初始化对象的时候,同时可以为对象进行赋值。
注意事项:
任何类定义出来,默认自带无参数构造器,写不写都有;
一旦定义了有参数构造器,无参数构造器就没有了,此时需要自己写无参数构造器;
建议在任何时候都手动写上空参和带全部参数的构造方法。
57.标准的JavaBean类
类名需要见名知意;
成员变量使用private修饰;
提供至少两个构造方法(无参、带全部参数);
成员方法:提供每一个成员变量对应的setXxx()/getXxx(),如果还有其他行为,也需要写上;
58.快捷键生成JavaBean
(1)编写完属性后Alt+insert(F12)/Alt+Fn+insert(F12)
- 空参:构造函数+无选择;
- 带全部参数:构造函数+ (ctrl+A) +确认;
- getset:getter and setter+ (ctrl+A) +确认;
(2)或下载ptg插件(Ptg To JavaBean)
59.一个对象的内存图
加载class文件;
申明局部变量;
在堆内存中开辟一个空间;
默认初始化;
显示初始化;
构造方法初始化;
将堆内存中的地址值赋值给左边的局部变量;
题解
1.请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。函数 myAtoi(string s) 的算法如下:
空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。
int myAtoi(char* s) {
int i=0,num=0,sign=1,len=strlen(s);
if(len==0)
return 0;
while(s[i]==' ')
i++;
if(s[i]=='-'){
sign=-1;
i++;
}else if(s[i]=='+'){
i++;
}
while(s[i]!='\0'){
if(s[i]<'0'||s[i]>'9'){
i++;
break;
}
if(num>INT_MAX/10)
return (sign>0?INT_MAX:INT_MIN);
if(num==INT_MAX/10){
if(sign>0&&s[i]>'7')
return INT_MAX;
else if(sign<0&&s[i]>='8')
return INT_MIN;
}
num=10*num-'0'+s[i];
i++;
}
num=num*sign;
return num;
}
先去除前导空格,再处理正负号,如果遇到'-',将sign设为-1,并跳过该字符;遇到 '+'则直接跳过该字符。遍历剩余的字符串字符,若遇到非数字字符,则跳出循环,否则进行越界判断,若num已经大于INT_MAX/10,则根据正负直接返回最大或最小值;若num等于INT_MAX/10,则检查下一个字符是否会导致溢出。对于正数,如果下一个字符大于'7',则返回INT_MAX;对于负数,如果下一个字符大于或等于'8',则返回 INT_MIN,使用num = 10*num - '0' + s[i]; 来更新num的值。最后,将num乘以正负号返回结果。
2.给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
bool isPalindrome(int x) {
char a[100];
sprintf(a,"%d",x);
int left=0,right=strlen(a)-1;
for(left,right;left<right;left++,right--) {
if(a[left]!=a[right])
return false;
}
return true;
}
把整数x转化为字符串存入数组中,定义两个左右索引,从数组头尾两边向内判断,若左索引的值与右索引不相等,返回false;否则返回true.
3.给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
- '.' 匹配任意单个字符
- '*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
bool isMatch(char * s, char * p) {
if(!*p)
return !*s;
bool match=*s&&(*s==*p||*p=='.');
if(*(p+1)=='*')
return isMatch(s,p+2)||(match&&isMatch(++s,p));
else
return match&&isMatch(++s,++p);
}
如果p为空,s为空,两者匹配返回true,s非空不匹配;
s非空,p == s || p == '.'时第一个字符匹配;
若(p+1) == '*',则有两种情况匹配:
- *匹配0个字符,s匹配剩下的,即isMatch(s, p+2)
- *匹配1个字符,继续用p匹配剩下的s,即match && isMatch(++s, p)
若(p+1) != '*',则递归判断剩下的是否匹配 match && isMatch(++s, ++p).