java基础学习
标识符和关键字
-
标识符
- 所有的标识符都应该由字母(a-z或者A-Z),美元符($),或者下划线(_)开始
- 首字符之后可以是字母(a-z或者A-Z),美元符($),或者下划线(_)、数字任意字符组合
- 不能使用关键字作为变量名或方法名
- 标识符是大小写敏感的
- 合法标识符举例:age、$salary、_value、__1_value
- 非法标识符举例:123abc、-salary、#abc
- 可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音
-
关键字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx5E9QCX-1615893238410)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313071044290.png)]
数据类型
-
强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
-
弱类型语言
JavaScript
-
Java的数据类型分为两大类
-
基本类型(primitive type)
-
数值类型
整数类型
-
byte占1个字节范围(-128-127)
-
short占2个字节范围(-32768-32767)
-
int占4个字节范围(-2147483648-2147483648)
-
long占8个字节范围(long类型要在数字后面加个L)
long num = 30L;
public class Demo{ public static void main(String[] args){ //整数拓展: 进制 二进制0b 十进制 //八进制0 十六进制0x int i = 10;//10(十进制) int i2 = 010;//8(八进制) int i3 = 0x10;//16(十六进制) System.out.println(i) System.out.println(i2) System.out.println(i3); } }
浮点类型
-
float类型(float占4个字节,double占8个字节)
//float类型要在数字后面加个F float num = 50.1F double num = 3.141582653589793238462643
//浮点数拓展?银行业务怎么表示?钱 //float 有限 离散 舍入误差 大约 接近但不等于 //double //最好完全使用浮点数来进行比较 float f = 0.1f; //0.1 double d = 1.0/10; //0.1 System.out.println(f==d); //false float d1 = 44444444845555555555555; float d2 = d1 + 1; System.out.println(d1==d2); //true
-
字符类型char占2个字节
//字符拓展 char c1 = 'a'; char c2 = '中'; System.out.println(c1); //a System.out.println((int)c1);//强制转换(97) System.out.println(c2); //中 System.out.println((int)c2);//强制转换(20013) //所有的字符本质还是数字 //编码 Unicode 表:97 = a 2字节 65536 Excel 2 16 //转义字符 //\t 制表符 //\n 换行 //对象 从内存中分析 String sa = new String("hello world"); String sb = new String("hello world"); System.out.println(sa==sb); //false String sc = "helloworld"; String sd = "helloworld"; System.out.println(sc=sd); //true
-
-
Boolean类型
占1位,其值是有true和false两个
//布尔值拓展 boolean flag = true; if(flag){} //老手 if(flag==true){} //新手
-
-
引用类型(reference type)
- 类
- 接口
- 数组
-
-
补充(什么是字节)
- 位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进制数
- 字节(byte):是计算机数据处理的基本单位,习惯上用大写B来表示
- 1B(byte,字节)= 8bit(位)
- 字符:是指计算机中使用的字母、数字、字和符号
- 1bit表示1位
- 1Byte表示一个字节1B=8b
- 1024B=1kb
- 1024KB=1M
- 1024M=1G
-
类型转换
-
由于java是强类型语言,所以要进行有些运算的时候需要用到类型转换
低 ---------------------------------> 高 byte,short,char->int->long->float->double
int i = 128; byte b = (byte)i; //内存溢出 double d = i; //强制转换(类型)变量名 高-->低 //自动转化 低-->高 System.out.println(i); //128 System.out.println(b); //-128 System.out.println(d); //128.0 /* 注意点: 1.不能对布尔值进行转换 2.不能把对象类型转换为不相干的类型 3.再把高容量转换到低容量的时候,强制转换 4.转的时候可能存在内存溢出,或者精度问题 */ //JDK7新特性,数字之间可以用下划线分割 int money = 10_0000_0000; int years = 20; int total = money*years;//计算的时候溢出 long total2 = money*years;//默认是int,转换前已存在问题 long total3 = money*(long(years));//2000000000 System.out.print(money); //1000000000
-
运算中,不同类型的数据先转化为同一类型,然后进行运算
-
强制类型转换
-
自动类型转换
-
变量
-
变量是什么:就是可以变化的量!
-
java是一种强类型语言,每个变量都必须声明其类型
//int a,b,c; //int a=1,b=2,c=3; //程序可读性 String name = 'lcw'; char x = 'X'; double pi = 3.14;
-
java变量是从心中最基本的存储单元,其要素包括变量名,变量类型和作用域
-
注意事项
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束
-
变量作用域
- 类变量
- 实例变量
- 局部变量
public class Demo{ //类变量 static double salary = 2500; //属性:变量 //实例变量:从属于对象:如果不自行初始化,这个类型的默认值为0,false,null String name; int age; //main方法 public static void main(String[] args){ int i = 0; //局部变量 System.out.println(i); //变量类型 变量名字 = new Demo(); Demo demo = new Demo(); System.out.println(demo.age); } //其他方法 public void add(){ } }
-
变量的密码规范
- 所有变量、方法、类名:见明知意
- 类成员:首字母小写,驼峰原则
- 局部变量:首字母小写,驼峰原则
- 常量:大写字母和下划线
- 类名:大写字母和驼峰原则
- 方法名:首字母小写、驼峰原则
常量
-
常量(Constant):初始化(initialize)后不能再改变值,不会变动的值。
-
所谓常量可以理解理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被更改
//修饰符(final),不存在先后顺序 static final double PI = 3.14; final static double PI = 3.14;
-
常量名一般使用大写字符
运算符
-
算术运算符:+ - * / % ++ –
-
赋值运算符:=
-
关系运算符:> < >= <= == != instanceof
-
逻辑运算符:&& || !
-
位运算符:& | ^ ~ >> << >>>(了解!!!)
-
条件运算符:?:
-
扩展赋值运算符:+= -= *= /=
short a = 10; byte b =20; System.out.println(a+b); //返回int类型 int a = 3; int b = a++; //执行完这行代码后,先给b赋值,再自增 int c = ++a; //执行完这行代码前,先自增,再给c赋值 //幂运算 double pow = Math.pow(3,2); System.out.print(pow); //9.0 //位运算 /* A = 0011 1100 B = 0000 1101 A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~B = 1111 0010 2*8 = 16 2*2*2*2 效率极高!!! << *2 >> /2 0000 0000 0 0000 0001 1 0000 0010 2 0000 0011 3 0000 0100 4 。。。 0000 1000 8 0001 0000 16 */ System.out.println(2<<3); //字符串连接符 + ,String System.out.println(""+a+b); System.out.println(a+b+""); //x?y:z //如果x==true,则结果为y,否则结果为z
包机制
-
为了更好地组织类,java提供了包机制,用于区别类名的命名空间
-
包语句的语法格式为:
package pk1[.pkg2[.pkg3...]];(定义包)
-
一般利用公司域名倒置作为包名:www.baidu.com com.baidu.www
-
为了能够使用某一个包的成员,我们需要在java程序中明确导入该包,使用“import”语句可完成此功能
import package1[.package2..].(classname|*);(导入包)
javaDoc生成文档
- javadoc命令是用来生成自己API文档的
- 参数信息
- @author作者名
- @version版本号
- @since指明需要最早使用的jdk版本
- @param参数名
- @return返回值情况
- @throws异常抛出情况
- cmd生成API
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pXrj0YM-1615893238412)(D:\大三下\java学习\练习\003javadoc\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WO5xR9b2-1615893238413)(D:\大三下\java学习\练习\003javadoc\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0p5yIaMm-1615893238415)(D:\大三下\java学习\练习\003javadoc\3.PNG)]
-
IDEA生成API
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7B4KIyWg-1615893238416)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313155154525.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa0drgrC-1615893238417)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313155028429.png)]
Java流程控制
Scanner
-
java.util.Scanner是java5的新特征,可以通过Scanner类来获取用户的输入
-
基本语法:
Scanner s = new Scanner(System.in);
-
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据
public class Demo{
public static void main(String[] args){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String str = scanner.next();//程序会等待用户输入完毕
System.out.println("输出的内容为:" + str);//假设输入为"hello world",输出为"hello"
}
//养成用完就关掉的好习惯
scanner.close();
}
}
public class Demo{
public static void main(String[] args){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输出的内容为:" + str);
scanner.close();
}
}
public class Demo{
public static void main(String[] args){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
//计算输入了多少个数字
int m = 0;
//通过循环判断是否还有输入,并在里面对每一次进行求和统计
while (scanner.hasNextDouble()){
double x = scanenr.nextDouble();
m = m + 1;
sum = sum + x;
}
System.out.println(m + "个数的和为:" + sum);
System.out.println(m + "个数的平均值为:" + (sum / m));
scanner.close();
}
}
- next()和nextLine()的区别
- next():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前的空白,next()会自动舍去
- 只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
- next()不能得到带有空格的字符串
- nextLine()
- 以Enter键为结束符,nextLine()返回回车之前的所有字符
- 可以获取空白
顺序结构
从上到下依次执行
选择结构
-
if单选择结构
if(boolean判断){ 执行内容; }else{ 执行内容; } //equal:判断字符串是否相等 xxx.equal("xxx")
-
if双选择结构
Scanner scanenr = new Scanner(System.in); System.out.println("请输入成绩:"); int score = scanner.nextInt(); if(score>60){ System.out.println("及格"); }else{ System.out.println("不及格"); } scanner.close();
-
if多选择结构
if(boolean判断){
执行内容;
}else if(boolean判断){
执行内容;
}else if(boolean判断){
执行内容;
}else if(boolean判断){
执行内容;
}else{
执行内容;
}
- 嵌套的if结构
if(boolean判断){
执行内容;
if(boolean判断){
执行内容;
}
}
- switch多选择结构
//case穿透
switch(expression){
case value:
//语句
break;
case value:
//语句
break;
case value:
//语句
break;
...
default :
//语句
}
循环结构
-
while循环
- while是基本的循环,它的结构如下:
while(布尔表达式){ //循环内容 }
-
只要布尔表达式为true,循环就会一直执行下去
-
大多数情况是要让循环停止下来,需要一个让表达式失效的方式来结束循环
-
少部分情况需要一直执行,比如服务器的请求响应监听
-
循环条件一种为true就会造成死循环,正常的业务编程中,应尽量避免死循环,会影响程序性能或者造成程序卡死崩溃
-
do…while循环
-
对于while语句而言,如果不满足条件,则不能进入循环,但有时候我们需要即使不满足条件也要至少执行一次
-
do…while循环和while循环相似,不同的是,do…while循环至少会执行一次
do{ //代码语句 }while(布尔表达式);
-
while的do…while的区别
- while先判断后执行,do…while先执行后判断!
- do…while总是保障循环体会被至少执行一次!这是他们的主要区别
-
-
for循环
-
for循环语句是支持迭代的一种通用结构,是最有效的、最灵活的循环结构
-
for循环执行的次数实在执行前就确定的,语法格式如下:
for(初始化;布尔表达式;更新){ //代码语句 }
public class Demo{ public static void main(String[] args){ //死循环 for(; ; ){ } //用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个 for(int i = 0; i <= 1000; i++){ if(i % 5 == 0){ System.out.print(i + "\t"); } if(i % (5*3) == 0){ System.out.println(); System.out.print("\n"); } } //打印九九乘法表 int i; int j; for(i = 1;i <= 9; i++){ for(j = 1; j <= i ; j ++){ System.out.print(j+"*"+i+"="+(i * j)+"\t"); } System.out.println(); } } }
-
-
增强for循环
-
java5引入了一种主要用于数组或集合的增强型for循环
-
java增强for循环语法格式如下:
for(声明语句 : 表达式) { //代码语句 }
//定义一个数组 int[] num = {10,20,30,40,50,60}; //遍历输出数组num for(int x : num){ System.out.println(x); }
-
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
-
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
-
break、continue
-
break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句
-
continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断
-
关于goto关键字
-
goto关键字很早就在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用:java没有goto。然而,在break和continue这两个关键字的身上,我们仍然可以看出一些goto的影子----带标签的break和continue
-
“标签”是指后面跟一个冒号的标识符,例如:label:
-
对java来说唯一用到标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另外一个循环,由于break和continue关键字通常指中断当前循环,大若随同标签使用,他们就会中断到存在标签的地方
-
java方法
-
方法是语句的集合,他们在一起执行一个功能
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
-
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合,我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样有利于我们后期的扩展
-
方法的定义
-
方法包含一个方法头一个方法体
修饰符 返回值类型 方法值(参数类型 参数名称){ 方法体 return 返回值; } return 0;//可以终止方法
-
-
方法的重载
- 重载就是一个类中,有相同的函数名称,但形参不同的函数
- 方法重载的规则:
- 方法名称必须相同
- 参数列表必须不同
- 方法的返回类型可以想同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
- 实现理论:
- 方法名称相同是,编译器会根据调用方法的参数个数、参数类型等逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错
-
递归-
- 递归包括两个部分:
- 递归头:什么时候不调用自身方法,如果没有头,将陷入死循环
- 递归体:什么时候需要调用自身方法
public class Demo(){ public static void main(String[] args){ System.out.println(f(3)); } public static int f(int n){ if(n == 1){ return 1; }else{ return n*f(n-1); } } } 边界条件:边界 前阶段 返回阶段
- 递归包括两个部分:
java数组数组的定义
-
数组的定义
-
数组是相同类型数据的有序集合
-
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
-
其中,每一个数据称作一个数组元素,每个元素可以通过下一个标来访问他们
public class ArrayDemo{ public static void main(String[] args){ //变量的类型 变量的名字 = 变量的值 //数组的定义 //注意声明的时候数组不存在,new的时候才创建了数组 int[] nums; //首选(声明) int nums2[]; nums = new int[10];//这里面可以存放10个数字 } }
//静态初始化:创建 + 赋值 int[] a = {1,2,3,4,5,6,7,8}; //动态初始化:包含默认初始化 int[] b = new int[10];
-
数组的基本特点
- 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的
- 其元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以是如何数据类型,包括基本类型和引用类型
- 数组变量属引用类型,数组也可以看出是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
-
二维数组
int a[][] = new int[2][5];
-
-
Array类讲解
int[] a = {1,3,7,2,6,5,4} System.out.println(a);//打印出内存地址 System.out.println(Arrays.toString(a));//遍历数组a int[] b = {1,3,7,2,6,5,4}; Arrays.sort(b);//对数组b进行从小到到的排序 System.out.println(Arrays.toString(b));//[1,2,3,4,5,6,7] int[] c = {1,3,7,2,6,5,4}; Arrays.fill(a,0);//数组填充 System.out.println(Arrays.toString(b));//[0,0,0,0,0,0,0]
-
稀疏数组
//建立一个11*11的数组
int[][] a = new int[11][11];
a[1][2] = 1;
a[2][3] = 2;
//遍历该数组
for(int[] n : a){
for(int m : n){
System.out.print(m+"\t");
}
System.out.println();
}
System.out.println("====================");
//计算该数组的有效数字个数
int sum = 0;
for(int i = 0; i < 11; i++){
for(int j = 0; j < 11; j++){
if(a[i][j] != 0){
sum++;
}
}
}
//建立一个稀疏数组
int[][] b = new int[sum + 1][3];
b[0][0] = 11;
b[0][1] = 11;
b[0][2] = sum;
int c = 1;
//遍历二维数组,将非零的值,存放稀疏数组中
for(int i = 0; i < 11; i++){
for(int j = 0; j < 11; j++){
if(a[i][j] != 0){
b[c][0] = i;
b[c][1] = j;
b[c][2] = a[i][j];
c++;
}
}
}
//输出稀疏数组
for(int[] m : b){
for(int n : m){
System.out.print(n+"\t");
}
System.out.println();
}
System.out.println("====================");
//1.读取稀疏数组
int[][] array = new int[b[0][0]][b[0][1]];
//2.给其中的元素还原其他的值
for(int i = 1; i < b.length; i++){
array[b[i][0]][b[i][1]] = b[i][2];
}
//3.打印数组array
for(int[] n : array){
for(int m : n){
System.out.print(m+"\t");
}
System.out.println();
}
面向对象
-
面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么…
- 面对过程适合处理一些较为简单的问题
-
面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行但对思考。最后,才对摸个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
-
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,任然需要面向过程的思路去处理
-
什么是面向对象
-
面向对象编程(Object-Oriented Programming,OOP)
-
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
-
抽象
-
三大特性:
- 封装
- 继承
- 多态
-
从认识论角度考虑是现有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
-
从代码运行角度考虑是先有类后有对象。类是对象的模板
-
方法的调用
public class Demo03 { //静态方法 //非静态方法 /* 实例化这个类new 对象类型 对象名 = 对象值 */ Student student = new Student(); } //学生类 public class Student { //非静态方法 public static void say(){ System.out.println("学生说话了"); } }
//static方法和类一起加载 public static void a(){ b(); } //类实例化之后才存在 public void b(){ } //所以已有的方法不能调用没有的方法
-
值传递
public class Demo(){ public static void main(String[] args){ int a = 1; System.out.println(a);//1 // Demo.change(a); System.out.println(a);//1 } //返回值为空 public static void change(int a){ a = 10; } }
-
引用传递
//引用传递:对象,本质还是值传递 public class Demo(){ public static void main(String[] args){ Person person = new Person(); System.out.println(person.name);//null Demo.change(person); System.out.println(person.name);//lcw } //返回值为空 public static void change(Person person){ person.name = "lcw"; } } //定义一个Person类,有一个属性:name class Person{ String name;//null }
-
-
类与对象的创建
//学生类 public class Student { //属性:字段 String name; //null int age; //0 //方法 public void study(){ System.out.println(this.name + "在学习"); } } //一个项目应该只存在一个main方法 public class Application { public static void main(String[] args) { //类:抽象的,实例化 //类实例化后会返回一个自己的对象 //student对象就是一个Student类的具体事例 Student xiaoming = new Student(); Student xiaohong = new Student(); xiaoming.name = "小明"; xiaoming.age = 3; System.out.println(xiaoming.name);//小明 System.out.println(xiaoming.age);//3 System.out.println(xiaohong.name);//null System.out.println(xiaohong.age);//0 } }
-
构造器
-
使用new关键字创建对象
-
使用new关键字创建的时候,处了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
public class Person { public Person() { } }
//new 实例化一个对象 Person person = new Person(); System.out.println(person.name);//lcw public class Person { //一个类即使什么都不写,他也会存在一个方法 //显示的定义构造器 String name; //实例化初始值 //1.使用new关键字,必须要有构造器 public Person(){ this.name = "lcw"; } }
//new 实例化一个对象 Person person = new Person("zhuli"); //zhuli System.out.println(person.name); System.out.println(); public class Person { //一个类即使什么都不写,他也会存在一个方法 //显示的定义构造器 String name; //实例化初始值 //1.使用new关键字,必须要有构造器 //2.初始化值 public Person(){ this.name = "lcw"; } //有参构造:一旦定义有参构造,无参就必须显示定义 public Person(String name){ this.name = name; } }
-
-
封装
-
该露的露,该藏的藏
- 程序设计追求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
-
封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
-
属性私有,get/set
public class Student(){ //属性私有 private String name; private int id; private char sex; //提供一些可以操作这个属性的方法! //提供一些public的get、set方法 public String getName(){ return this.name; } public void setName(String name){ this.name = name; } } /* 1.提高程序的安全性 2.隐藏代码的实现细节 3.可维护性 */ Student s1 = new Student(); s1.setName("lcw"); System.out.println(s1.getName);//lcw
-
-
继承(私有的东西不能被继承)
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extands的意思是“扩展”。子类是父类的扩展
-
java中只有单继承,没有多继承
-
继承是类和类之间的一种关系。除此之外,类和类之间的的关系还有依赖、组合、聚合等
-
继承关系的两个类,一个为子类(派生类)一个为父类(基类)。子类继承父类,使用关键字extends来表示
-
子类和父类之间,从意义上讲应该具有“is a“的关系
-
object类
-
super
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能从现在子类的方法或构造方法中
- super和this不能同时调用构造方法
//一个项目应该只存在一个main方法 public class Application { public static void main(String[] args) { Student student = new Student(); student.test("lsh"); //lsh lsw lcw } } //Person 人:父类 public class Person { protected String name = "lcw"; } //学生类 子类,派生类 public class Student extends Person{ //属性私有 private String name = "lsw"; public void test(String name){ System.out.println(name); System.out.println(this.name); System.out.println(super.name); } }
-
this
- 代表的对象不同:
- this:本身调用者这个对象
- super:代表父类对象的应用
- 前提
- this:没有继承也可以使用
- super:只能做基础条件才可以使用
- 构造方法
- this();本类的构造
- super();父类的构造
- 代表的对象不同:
-
方法重写
- 需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小:public>protected>default>private
- 抛出的异常:范围,可以被缩小,但不能扩大: classnotfoundexception —> exception(大)
- 为什么需要重写:
- 父类的功能,子类不一定需要,或者不一定满足
- 静态的方法重写
public class Application { public static void main(String[] args) { //方法的调用只和左边,定义的数据类型有关 A a = new A(); a.test();//A=>test() //父类的引用指向了子类 B b = new A(); b.test();//B=>test() } } public class B { public static void test(){ System.out.println("B=>test()"); } } public class A extends B{ public static void test(){ System.out.println("A=>test()"); } }
- 非静态的方法重写
public class Application { public static void main(String[] args) { //方法的调用只和左边,定义的数据类型有关 A a = new A(); a.test();//A=>test() //父类的引用指向了子类 B b = new A(); b.test();//A=>test() } } public class B { public void test(){ System.out.println("B=>test()"); } } public class A extends B{ public void test(){ System.out.println("A=>test()"); } }
-
-
多态
注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常
- 存在条件:继承关系,方需要重写,父类引用指向子类对象 Father f 1 = new Son();
- static方法,属于类,他不属于实例
- final常量
- private方法
public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //new Student(); //new Person(); //可以指向的应用类型就不确定了,父类的引用指向子类 //Student 能调用的方法都是自己的或者继承父类的! Student s1 = new Student(); //Person 父类型,可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); Person p1 = new Person(); Object s3 = new Student(); //对象能执行那些方法,主要看对象左边的类型,和右边类型关系不大 s1.run(); //studentrun s1.eat(); s2.run();//子类重写了父类的方法,执行子类的方法//studentrun // ((Student)s2).eat(); p1.run(); } } public class Person { public void run(){ System.out.println("personrun"); } } public class Student extends Person{ public void run(){ System.out.println("studentrun"); } public void eat(){ System.out.println("eat"); } }
- 多态是方法的多态,属性没有多态
-
instancepf(类型转换) 引用类型,判断一个对象是什么类型
-
抽象类
//abstract抽象类 //抽象类可以写普通方法 //抽象方法必须在抽象类中 //不能去new这个抽象类,只能靠子类去实现它 public abstract class Action{ //约束,有人帮我们实现 //abstract,抽象方法,只有方法名字,没有方法体 public abstract void doSomething(); } //抽象类的所有方法,继承了它的子类,都必须要实现他的方法,除非他也是抽象类 public A extends Action{ public void doSomething(){ System.out.println("A"); } }
-
**接口 interface(只有规范,自己无法写方法)**约束和实现分离
//interfance定义的关键字,接口都需要一个实现类 public interface UserService{ //接口中的所有定义其实都是抽象的public abstract void add(String name); void delete(String name); void update(String name); void query(String name); } //类可以实现接口欧implements接口,可以多个接口 public class UserServiceImpl implements UserService{ void add(String name){}; void delete(String name){}; void update(String name){}; void query(String name){}; }
-
异常(Exception)
//自定义的异常类 public class MyException extends Exception{ //传递数字>10; private int detail; public MyException(int a){ this.detail = a; } //toString:异常的打印消息 @Override public String toString(){ return "MyException{" + "detail=" + detail + '}'; } } public class Test{ //可能会存在异常的方法 static void test(int a) throws MyException{ System.out.println("传递的参数为:" + a); if(a>10){ throw new MyException(a);//抛出 } System.out.println("ok"); } public static void main(String[] args){ try{ test(11); }catch(MyException e){ System.out.println("MyException"+e); } } }