JAVA基础(个人向)
1. 流程控制语句
1.1 选择语句Switch
- 其优势在于列举出少量可选择的问题上很有逻辑和效率。相比于if选择结构,嵌套的减少也能增加程序的可读性,但是在运行效率上,比起if会稍微差点。
例如:
- 选择题问题
import java.util.Scanner ;
class SwitchTest{
public static void main(String[] args){
//先给出几个选项
System.out.println("电视剧<<我们结婚吧>>杨桃谁扮演的?") ;
System.out.println("65 高圆圆");
System.out.println("66 刘亦菲");
System.out.println("67 张佳宁");
System.out.println("68 高斯林");
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入并提示
System.out.println("请您输入数据:") ;
int choice = sc.nextInt() ;
//强转
char choiceNum = (char)choice;
//提供switch语句选择判断
switch(choiceNum){
case 'A':
System.out.println("恭喜您,答对了...") ;
break ;
case 'B' :
System.out.println("对不起,错误...") ;
break ;
case 'C' :
System.out.println("对不起,错误...") ;
break ;
case 'D' :
System.out.println("对不起,错误...") ;
// break ;
default:
break ;
}
}
}
- 选择奥运五环福娃
import java.util.Scanner;
public class Demo7 {
//北京欢迎你
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
int num = input.nextInt();
switch(num) {
case 1:System.out.println("贝贝");break;
case 2:System.out.println("晶晶");break;
case 3:System.out.println("欢欢");break;
case 4:System.out.println("迎迎");break;
case 5:System.out.println("妮妮");break;
default :System.out.println("北京欢迎你");
}
}
}
1.2 循环语句for
-
格式
for(初始化语句;条件表达式;步长/控制体语句){
循环体语句;
} -
执行流程
1)执行初始化化语句:给变量进行赋值
2)满足条件:成立
3)执行循环体语句
4)执行步长/控制体语句
例如:
- 输出10次helloworld
for(int x = 0 ; x < 10 ; x ++){//x=0 ,0<10,1<10 9<10 x++ -- x = 10 10 < 10 (false)
System.out.println("helloworld") ;//1),2)....10)
}
- 1-100之间的和
int sum = 0 ;
for(int x = 1 ; x <= 100 ; x ++){
//循环体
sum += x ;
}
System.out.println("1-100之间的和:"+sum) ;
- 水仙花数
for(int x = 100 ; x < 1000; x++){
//定义三个变量:分别获取每个位上的数据本身
int ge = x % 10 ;
int shi = x / 10 % 10 ;
int bai = x / 10 /10 % 10 ;
//判断
if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
//获取水仙花
System.out.println("水仙花数是:"+x) ;
}
1.3 循环语句while
-
格式
while(条件表达式){
循环体语句;
控制体语句/步长语句;
} -
执行流程
1)初始化话语句进行赋值
2)条件表达式成立,
执行循环体语句
再次执行控制体语句
3)再次判断条件表达式是否成立,
…
…
当条件不成立,则while结束 -
应用场景
不明确循环次数的时候使用 -
效率
for循环节省内存空间
例如:
- 输出10次"helloworld"
int x = 1 ;
while(x<=10){
System.out.println("helloworld") ;
x ++ ; //控制体语句不要忘
}
- 1-100的偶数和
int x = 1 ;
int sum = 0 ;
while(x<=100){
if(x % 2 ==0){
sum += x ;
}
x ++;
}
System.out.println("1-100之间的偶数和:"+sum) ;
- 5的阶乘
int jc = 1 ;
int j = 1 ;
while(j<=5) {
jc*= j ;
j++ ;
}
System.out.println("5的阶乘是:"+jc) ;
1.3 循环语句do……while
-
格式
初始化语句;
do{
循环体语句;
控制体语句;
}while(条件表达式) ; -
for,while,do……while的区别
dowhile:优先循环体语句,即使条件不成立,循环体至少执行一次!
开发中优先for,其次while,再次do-while
例如:
- 1-100之间的和
int sum = 0 ;
int x = 1 ;
do{
sum += x ;
x ++ ;
}while(x<=100) ;
//输出sum
System.out.println("1-100之间的和是:"+sum) ;
1.4跳转控制语句
-
break
结束中断,结束循环,在switch和循环中使用 -
continue
继续, 在循环中使用,结束当前循环,立即进入下一次循环 -
return
很少单独使用,结合有具体返回值类型的方法使用
2.方法
- 概述
就是使用{}代码块包起来,并且起一个名字
2.1 有具体返回值类型的方法
-
格式
public static 返回值类型 方法名(参数类型1 变量名1,参数类型2 变量名2…){
方法中的业务逻辑代码…
return 结果;
} -
注意事项
1)明确返回值类型
2)明确参数类型以及参数个数
3)方法和方法是平级关系,不能进行嵌套
4)在Java中,定义方法的时候形式参数必须携带数据类型
5)调用方法的时候,传递的实际参数不需要在携带数据类型
6)定义方法的时候: 有{括号的地方不能有分号
2.2 没有具体返回值类型的方法
-
定义
针对某个功能代码块{} 没有具体的返回值类型,按照语法规定:必须有一个值 -
格式
public static void 方法名(形式参数列表){
方法体中的内容:直接输出 或者进行其他操作;(不需要return语句了)
} -
注意事项
1)只能单独调用
2)不能输出调用
3)不能赋值调用
2.3 方法重载
-
目的
为了提高某个功能的扩展性,在有的时候:同一个方法,可以传递任何数据类型 -
特点
方法名相同,参数列表不同,参数个数不同,参数类型不同,与返回值无关 -
重载的方式
举例:
sort(byte[] byte)
sort(double[] d)
sort(int[] i)
sort(float[] f)
3.数组
3.1 概念
数组就是存储多个数据的容器,必须保证容器中的数据类型一致
3.2 数组的定义
-
动态初始化
给定了数组的长度,系统默认对元素进行初始化!
数据类型[] 数组名称 = new 数据类型[数组长度] ;
数据类型 数组名称[] = new 数据类型[数组长度] ; -
静态初始化
我们给定的具体的元素,数组长度由系统确定
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3…} ;
数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3…} ;
3.3 数组应用场景
- 获取数组中的最大值
1)定义max变量:将数组的第一个元素赋值给他:默认最大值
2)从角标1开始遍历其他元素
在里面判断
如果后面的元素都大于max
将后面的元素赋值给max变量
3)最终可以获取最大值 - 获取数组中的最小值
1)定义变量min :将数组的第一个元素赋值给min:默认最小值
2)遍历其他元素
判断:如果后面的元素都min小,
将后面的元素赋值给min
3)获取最小值 - 令一个数组静态初始化
int[] arr = {69,87,43,21,15} - 数组的元素逆序
将arr[0]元素和arr[arr.length-1-0]进行互换
将arr[1]元素和arr[arr.length-1-1]进行互换
…
保证数组的长度/2 - 数组的查表法
通过数组名称[索引值]来确定元素内容 - 高级查找:二分查找
前提条件:数组必须有序的
3.4 高级排序:冒泡排序
-
排序思想
两两比较,较大的值往后放,第一次比较完毕,最大值出现在最大索引处
依次这样比较,可以得到排好序的数组! -
核心代码
for(int x = 0;x < arr.length-1 ; x ++){//外层:比较的次数
for(int y = 0 ;y < arr.length-1-x; y++){ //内层循环:进行比较互换
//判断
if(arr[y] > arr[y+1]){
int temp = arr[y] ;
arr[y] = arr[y+1] ;
arr[y+1] = temp ;
}
}
}
4.面向对象
4.1 面向对象基于面向过程
1. 面向过程: (自己就是执行者)
代表:c语言
1)需求分析
2)定义功能代码块(方法)
3)在main 方法调用,显示结果
2.面向对象:
代表java语言
需要找一个对象完成一件事件:比如 :键盘录入一个数据 (jdk提供—>Scanner)
创建键盘录入对象
提示并录入数据
展示结果
4.2 思想特点及其特征
思想特点
1)更符号我们生活中是思想行为习惯
2)让复杂的事情简单化
3)我们从执行者变成了指挥者
特征
封装,继承,多态
举例:大象装冰箱
//测试类
class Demo{
public static void main(String[] args){
创建冰箱类对象
冰箱类对象.open() ;
创建出大象类对象
大象类对象.in() ;
冰箱类对象.close() ;
}
}
//定义一个大象类
class 大象类{
//应该定义一个功能:大象有进去的功能
public void in(){ //将static去掉
System.out.println("大象进去了...") ;
}
}
//冰箱类
class 冰箱类{
//开
public void open(){
System.out.println("开冰箱门") ;
}
//关
public void close(){
System.out.println("关冰箱门") ;
}
}
4.3 类的定义以及测试
举例:手机类和手机测试类
手机类
class Phone{
//成员变量
String brand ; //品牌
int price ; //价格
String color ;//颜色
int memory ; //内存
//成员方法
public void callPhone(String toName){ //参数toName:给谁打电话
System.out.println("给"+toName+"打电话") ;
}
public void sendMsg(){
System.out.println("可以使用手机发短信...") ;
}
public String playGame(String gameName){
return "可以玩"+gameName+"游戏" ;
}
public void study(String className){
System.out.println("学习"+className) ;
}
}
手机测试类
class PhoneTest3{
public static void main(String[] args){
//创建两个手机类对象
//定义第三个Phone类型的变量 p3
//将第一个手机类对象赋值给p3变量
//再次通过p3.访问成员变量 ="赋值"
//输出:第一个手机类对象中的所有属性
Phone p1 = new Phone() ;
p1.brand = "小米11" ;
p1.price = 3999 ;
p1.color = "黑色";
p1.memory = 128;
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color+"---"+p1.memory) ;
Phone p2 = new Phone() ;
p2.brand = "华为mate40保时捷版" ;
p2.price = 12999;
p2.color = "天空之境";
p2.memory = 128 ;
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color+"---"+p2.memory) ;
//定义第三个Phone类型的变量 p3
Phone p3 = p1 ;
p3.brand = "iphone11" ;
p3.price = 1299 ;
p3.color ="土豪金" ;
p3.memory = 64 ;
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color+"---"+p1.memory) ;
}
}
4.4 成员变量和局部变量
1)在程序中的书写位置不同
局部变量: 方法定义中或者方法声明上
成员变量:在类中,成员方法外定义的变量
2)在内存中
局部变量:在栈内存中
成员变量:在堆内存中
3)生命周期不同
局部变量:随着方法调用而存在,随着方法调用完毕而消失!
成员变量:随着对象的创建而存在,随着对象创建完毕之后,不会立即消失,
需要等待GC(垃圾回收器空闲时候回收掉!)
GC算法----->标记算法
标记—清除
4)初始化不同
局部变量:可以先定义,但是必须在使用之前必须赋值,否则:可能尚未初始化变量
成员变量:可以不初始化,它存在系统默认初始化!(根据类型判定)
4.5 形式参数具体问题
1.实际类型
如果一个方法的形式参数是引用类型是具体类,那么调用该方法时,实际参数需要传递的是当前类的具体对象
2.引用类型
如果方法的形式参数是一个引用类型,就需要创建当前类对象
4.6 匿名对象
1.概念
没有名字的对象
2.格式
new 类名() ;
3.特点
可以作为参数进行传递
在开发中,匿名对象使用一次即可!
(因为没有栈内存变量指向堆内存地址,
直接是在堆内存开辟空间,使用完毕,立即被回收!)
4.7 封装
1.目的
为了保证的数据的安全性,将某个类的成员属性隐藏(将属性(成员变量)“私有化”),并为之提供公共(public)访问方式(setXXX()/getXXX())
2.private关键字的特点
1)可以修饰成员变量,也可以修饰成员方法,但是都只能在本类访问,外界类不能够访问
2)这些被私有修饰的成员变量,或者成员方法,可以间接通过公共方法来访问
3.私有类成员属性的调用
给类中的成员加入私有修饰,对外提供公共的方法(setXXX()/getXXX())
’
举例:
class Student2{
//成员变量私有化
private String name ;//姓名
private int age ; //年龄
private String gender ;//性别
private String hobit ; //爱好
//成员方法
public void study(){
System.out.println("学习JavaEE...") ;
}
//玩游戏
public String playGame(String gameName){
return "会玩"+gameName ;
}
//运行
public void sport(){
System.out.println("喜欢踢足球...") ;
}
//一些公共访问方法:给姓名,年龄,性别,爱好赋值 /还需要获取这些内容
//给学生的姓名赋值
public void setName(String n){ //"高圆圆"
name = n ;//name = n = "高圆圆"
}
//获取学生的姓名--->返回值:String
public String getName(){
return name ;
}
//给学生的年龄赋值
public void setAge(int a){ //41
age = a ; //age = a = 41
}
//获取学生的年龄:int类型
public int getAge(){
return age ;
}
//给学生的性别赋值
public void setGender(String g){ //"女"
gender = g ; //gender = g ="女"
}
//获取学生的性别:String
public String getGender(){
return gender ;
}
//给学生的爱好赋值
public void setHobit(String h){ //"跑步"
hobit = h ; //hobit = h = "跑步"
}
//获取学生的爱好:String
public String getHobit(){
return hobit ;
}
}
//测试类
class StudentTest2{
public static void main(String[] args){
//创建学生类测试
Student2 s = new Student2() ;
/*
s.name = "高圆圆" ;
s.age= 41 ;
s.gender = "女" ;
s.hobit = "跑步" ;
*/
//对象名.公共的成员方法名() 赋值
s.setName("高圆圆") ;
s.setAge(41) ;
s.setGender("女") ;
s.setHobit("跑步") ;
System.out.println("当前学生的姓名是:"+
s.getName()+",年龄是:"+s.getAge()+",性别是:"+s.getGender()+",爱好是:"+s.getHobit()) ;
//其他成员方法
s.study() ;//学习
String str = s.playGame("lol") ;
System.out.println(str) ;
s.sport() ;
}
}