权限修饰符
权限修饰符
什么是权限修饰符?
权限修饰符是用来限制类的成员(成员变量 成员方法 构造器...)能够被访问的范围
每一种权限修饰符能够被访问的范围如下
| 修饰符 | 在本类中 | 在同一个包下的其他类 | 任意包下的子类 | 任意包下的任意类里 | |
|---|---|---|---|---|---|
| 私有方法 | private | √ | |||
| 缺省 | 缺省 | √ | √ | ||
| 受保护的 | protected | √ | √ | √ | |
| 公开的 | public | √ | √ | √ | √ |
private < 缺省 < protected < public
权限修饰符是用来限制类的成员(成员变量 成员方法 构造器...)能够被访问的范围
| 修饰符 | 在本类中 | 在同一个包下的其他类 | 任意包下的子类 | 任意包下的任意类里 | |
|---|---|---|---|---|---|
| 私有方法 | private | √ | |||
| 缺省 | 缺省 | √ | √ | ||
| 受保护的 | protected | √ | √ | √ | |
| 公开的 | public | √ | √ | √ | √ |
private < 缺省 < protected < public
访问父类成员
super.成员变量 //访问父类成员变量
super.成员方法 //调用父类成员方法
super() //调用父类的无参构造器
super(参数)//调用父类的有参构造器
访问本类成员
this.成员变量 //访问本类成员变量
this.成员方法 //访问本类的成员方法
this() //调用本类的空参构造器
this(参数) //调用本类的有参构造器
注意:this和super访问构造方法 只能用到构造器的第一句话否则会报错
当子类继承父类且父类存在非私有属性, 子类的构造方法可以接收父类的属性
当子类被创建出来时,想同时调用父类构造器时用super();
子类可以继承父类的非私有成员(成员变量和成员方法)
继承后对象的创建是由子类和父类共同实现的
提高代码复用性
Java 只支持单继承,无法多继承
但是可以多层继承
java的祖宗类Object 如果不显示的继承object java是默认继承的
//String 类在 java.lang 包下,所以使用的时候不需要导包//equals方法
//判断是否相同 参数Object 可以代表所有的引入数据类型
//引入数据类型的对比
//trim方法
//删除首尾空格
//contains 方法
//判断一个字符串是否包含某个字符串
//返回 Boolean
//startsWith 方法
//判断是否是指定字符串开头
//返回 Boolean
//emdWith 方法
//判断是否是指定字符串结尾
//返回 Boolean
//toUpperCase 方法
//将字符串的英文全部转换成大写
//toLowerCase 方法
//将字符串的英文全部转换成小写
//charAt 方法
//获取索引位置的字符
//返回字符
//length 方法
//获取字符串的长度
//返回int
//toCharArray 方法
//将字符串转换成字符数组
//返回 char[]
//substring 方法
//截取字符串
//int index 的时候
//从index索引位置截取到末尾(包含开始)
//start end
//从start-end索引位置内容(包含开始,不包含结束)
//replace 方法
//替换指定字符串
// split 方法
// 分隔字符串//获取当前时间戳
// System.currentTimeMillis()//主要用来拼接字符串 static 静态
static修饰成员变量(静态成员变量)和成员方法(静态成员方法 )
成员变量一共分为静态(类)变量和实例变量
静态变量是要使用static修饰符 进行 修饰
由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量
实例变量无法通过类名.变量名获取
实例变量是属于对象的,需要通过对象才能调用:对象.实例变量静态经常用在工具类
/**
* 生成验证码的工具类
* @author TongHui
* @date 2023.04.14 10:59
*/
public class CaptchaUtil {
public static String getCaptcha(int length) {
// 1、定义2个变量 一个是记住最终产生的随机验证码 一个是记住可能用到的全部字符
String code = "";
String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
// 2、开始定义一个循环产生每位随机字符
for (int i = 0; i < length; i++) {
// 3、随机一个字符范围内的索引。
int index = r.nextInt(data.length());
// 4、根据索引去全部字符中提取该字符
code += data.charAt(index); // code = code + 字符
}
return code;
}
}
//使用方法 CaptchaUtil.getCaptcha(验证码长度)//静态代码块
//对象被加载的时候执行 静态代码块只会被执行一次
//无法访问实例方法和成员变量
static{
}//实例代码块可以访问的实例成员
{
可以直接访问实例成员
} package com.tonghui.day07;
public class Student {
// 属性:用成员变量表示
/**
* 学生姓名
*/
String name;
/**
* 年龄
*/
int age;
/**
* 体重
*/
double weight;
/**
* 性别
*/
String sex;
//行为:用成员方法表示(没有static关键的方法)
/**
* 行为: 学习方法
*/
public void study(){
System.out.println("好好学习");
}
/**
* 行为: 打游戏
* @param gameName 游戏名称
*/
public void playGame(String gameName){
System.out.println("喜欢打"+gameName);
}
}
//不用
Student su = new Student();
su.name="张三";//使用get和set对成员属性进行赋值和获取
/**
* 获取name值
*/
public String getName(){
return name;
}
/**
* 设置name值
*/
public void getName(String name){
this.name=name
}
//所有的成员变量都要加上private关键词
//作用:属性私有化,其他类访问不到成员变量,只能被本类访问//public
//作用:成员行为公开,所有类都可以访问到//Refrigerator.java
package com.tonghui.day07;
/**
* @author TongHui
* @date 2023.04.06 10:43
*/
public class Refrigerator{
/**
* 放进的物品
*/
private String name;
/**
* 打开冰箱门
*/
public void openDoor(){
System.out.println("打开门");
}
/**
* 把物品 放进冰箱
*/
public void push(){
System.out.println("把"+name+"放进冰箱");
}
/**
* 关门
*/
public void closeDoor(){
System.out.println("关上冰箱门");
}
/**
* 设置name
* @param name 需要放进冰箱的物品
*/
public void setName(String name) {
this.name = name;
}
}
//Test.java
package com.tonghui.day07;
/**
* @author TongHui
* @date 2023.04.06 10:41
*/
public class Test {
public static void main(String[] args) {
Refrigerator refrigerator = new Refrigerator();
refrigerator.setName("大象");
refrigerator.openDoor();
refrigerator.push();
refrigerator.closeDoor();
}
}//使用构造方法
//特点:
//类型和方法名相同
//没有返回值类型,连void都不能写
//调用格式
//new 类名(参数)
//每一个类都默认的一个无参构造器
//一旦写了有参的构造器 那么无参构造器就没了
//构造器与set方法给属性赋值的区别:
//构造器只能给属性赋值一次(只适合于参数不多的情况)
//set方法可以多次:::tips
一个类就是一个数据类型
:::
//1.定义位置
//成员变量:定义在类中方法外 作用于整个类
//局部变量:定义在方法内或方法生命上作用与方法里
//2.在内存中的位置
//成员变量在:堆内存中
//局部变量在:栈内存中
//3.生命周期
//成员变量:随着对象的创建而创建,随着对象的消失而消失
//局部变量:随着方法的调用而创建,随着方法的消失而消失
//4.初始化值
//成员变量有默认值
//局部变量没有默认值,必须赋值//封装:
//就是将不想对外暴露的属性隐藏起来,对外提供一些方法供别人去操作,这样可以更安全,也可以提高代码的复用性
//this:
//可以用来区分局部变量和成员变量同名问题;
// this代表当前对象的引用 谁来调用这个方法 this就代表谁
//一个出租车 属性: 车牌 车型 所属公司
//行为: 载客 输出(尊敬的....乘客,....的车载您到了目的)
package com.tonghui.day07;
/**
* 出租车的类
* @author TongHui
* @date 2023.04.06 16:18
*/
public class Taxi {
/**
* 车牌
*/
private String id;
/**
* 所属公司
*/
private String firm;
/**
* 车型
*/
private String type;
public Taxi() {
}
public Taxi(String id, String firm, String type) {
this.id = id;
this.firm = firm;
this.type = type;
}
public void passenger(String name){
System.out.println("尊敬的"+name+"乘客,"+firm+"的车载您到了目的");
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return firm
*/
public String getFirm() {
return firm;
}
/**
* 设置
* @param firm
*/
public void setFirm(String firm) {
this.firm = firm;
}
/**
* 获取
* @return type
*/
public String getType() {
return type;
}
/**
* 设置
* @param type
*/
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Taxicab{id = " + id + ", firm = " + firm + ", type = " + type + "}";
}
}
Taxi taxi = new Taxi();
taxi.setId("浙A XXXXXXX");
taxi.setFirm("123");
taxi.setType("轿车");
taxi.passenger("TongHui");
Taxi taxi1=new Taxi("浙A XXXXXXX","1234","面包车");
taxi1.passenger("TongHui1");
//一段具有独立功能的代码块 调用后执行
//代码块 在一对大括号的多行代码
//定义位置 在类里面 与main方法平级
//格式:
// public static void 方法名() {
// 方法体
// }//提高代码的复用性//调用:方法名()/**
* 自定义一个方法 打印1-100的整数
*/
public class Test {
public static void main(String[] args) {
printNum();
}
/**
* 打印1-100的整数
*/
public static void printNum(){
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
}
}
// 格式(多个参数):
// public static void 方法名 (数据类型 变量名1,数据类型 变量名2 ,…… ) {
// … …
// }
// 范例(多个参数):
// public static void getMax( int number1,int number2 ) {
// … …
//}
// 方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
// 方法定义时,多个参数之间使用逗号(,)分隔 //形参:全称形式参数,是指在定义方法时,所声明的参数
//实参:全称实际参数,调用方法时,实际传入的参数//方法调用时,形参和实参的数量和类型必须相匹配,否则将出现编译错误//设计一个方法(print) 用于打印 n 到 m 之间所有的奇数
//需求:设计一个方法(getMax) 这个方法可以打印 任意 3个整数中的最大数
//需求:设计一个方法(printArrMax) 这个方法可以打印 一个int数组中的最大值
//需求:设计一个方法(printArrSum) 这个方法可以打印 一个int数组中各个元素的和
public static void main(String[] args) {
print(10,30);
getMax(10,30,20);
int [] arr={20,30,40};
printArrMax(arr);
printArrSum(arr);
}
/**
* 打印 n-m之间的所有奇数
* @param n 任意数
* @param m 任意数
*/
public static void print(int n,int m){
int temp;
if (m<n){
temp=m;
m=n;
n=temp;
}
for (int i=n;i<=m;i++){
if (i%2==1){
System.out.print(i);
}
}
}
/**
* 打印任意三个整数最大值
* @param a 任意数
* @param b 任意数
* @param c 任意数
*/
public static void getMax(int a,int b,int c){
int temp=a>b?a:b;
temp=temp>c?temp:c;
System.out.println("最大值:"+temp);
}
/**
* 打印 数组中最大值
* @param arr 数组
*/
public static void printArrMax(int[] arr){
int temp=0;
for (int i = 0; i < arr.length; i++) {
if (temp<=arr[i]){
temp= arr[i];
}
}
}
/**
* 打印个数组中各个元素的和
* @param arr 数组
*/
public static void printArrSum(int[] arr){
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum=sum+arr[i];
}
}//定义一个方法 把任意字符数组拼接成一个字符串
/**
* 将字符数组拼接成一个字符串
* @param c 拼接的字符数组
*/
public static void toStrings(char[] c){
String s="";
for (int i = 0; i < c.length; i++) {
s=s+c[i];
}
System.out.println(s);
}//定义:
// 返回值 :就这件事情做完之后的结果
// 返回值类型: 这件事情做完后的结果的数据类型
// 方法名:这件事情的名字
// 参数:做这件事情需要的东西
// 参数类型 : 参数的数据类型
// 参数名:就是给参数取的一个名字
//格式:
// public static 返回值类型 方法名(参数类型 参数名,参数类型2 参数名2,.....){
// 方法体;
// return 返回值;
// }
// 例如:
// public static int getMax(int a,int b){
// int max = a>b?a:b;
// return max;
// }//1.返回一个值
//2.终止方法的运行
//3.void的方法也可以写return,后面什么也不加
//4.return后面不能直接写代码
//5.switch中也可以搭配return,且具有break的作用
//6.一个方法呢可以有多个return,但是必须处在不同的作用域里面//定义一个方法
//该方法可以给水果称重算钱
//方法名weight()
//第二个方法
//该方法可以转账 付钱
//在方法里面就写一条输出语句
//本次转账多少钱
public static void main(String[] args) {
pay(weight(10.0,1.2));
}
/**
* 称重算钱
* @param weight 重量
* @param money 钱
* @return
*/
public static double weight(double weight,double money){
return weight*money;
}
/***
* 转账
* @param money 需要转账的金额
*/
public static void pay(double money){
System.out.println("本场转账"+money);
}// 1.返回值
// 2.方法名
// 3.参数列表//(第二要素+第三要素)(方法名+参数列表)//同一个类中,方法名相同,参数列表不同的方法叫重载
//参数个数不同
//参数类型不同
//参数的多类型顺序不同 一个可以存很多数据的容器
1.类型[] 变量名;规范`写法`例如 int[] array;
2.数据类型 变量名[] 注意:(不要使用)例如 int array[];
//动态指定长度
//推荐使用
int[] ageArray=new int[4];//数组索引
//0 1 2 3 4 5
//索引范围 0-(数组的长度-1)int[] ageArray=new int[4];
//设置数组索引为0的值改为18
ageArray[0]=18;
String[] nameArray=new String[4];
nameArray[0]="张三";
nameArrayp[1]="李四";
//获取数组索引为1的内容
System.out.prinln(nameArray[0]);//遍历修改数组内容
for(int i=0;i<ageArray.length;i++){
ageArray[i]=10;
}
//遍历查询数组内容
for(int i=0;i<ageArray.length;i++){
System.out.prin(ageArray[i])
}//定义一个长度为5的数组
//使用键盘录入五个明星的名字
//再写一个遍历输出你录入的名字 在一行
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String[] names=new String[5];
System.out.println("请输入五个明星名字");
for (int i = 0; i < names.length; i++) {
names[i]= sc.next();
}
System.out.print("你输入的五个明星名字是:");
for (int i = 0; i < names.length; i++) {
System.out.print(names[i]+" ");
}
}
}//数组索引越界
//报错提示: ArrayIndexOutOfBoundsException
int[] arr=new int[4]
System.out.println(arr[4]) //动态初始化数组 有默认值
//整形数组默认是0
//浮点数组默认是0.0
//布尔数组默认是false
//字符数组默认是空格
//字符串数组默认是null
//所有引入型数组默认值都是null//1.省略格式 推荐使用
//格式 类型[] 变量名={"a","b"};
//例如:
String[] arr={"春","夏","秋","冬"};
int[] arr1={1,2,3,4,5,6};
// 2.标准格式 不推荐使用
// 格式: 数据类型[] 数组名=new 数据类型[] {元素1,元素2,元素3}//数组求和
//对数组求平均数
int[] arr1={1,2,3,4,5,6};
int sum=0;
for (int i = 0; i < arr1.length; i++) {
sum=sum + arr1[i];
}
System.out.println("该数组的和是"+sum);
System.out.println("该数组的平均数是"+((float)sum/(float)arr1.length));//生成10个范围在[67-324]之间的随机数
//把生成的随机数放进数组里面
//根据数组把奇数的和求出来 并输出
Random r=new Random();
int[] arr=new int[10];
int sum=0;
for (int i = 0; i < arr.length; i++) {
arr[i]=r.nextInt(258)+67;
if (arr[i]%2!=0){
sum=sum+arr[i];
}
}
System.out.println(sum);//生成10个范围在[67-324]之间的随机数
//把生成的随机数放进数组里面
//求数组中最小值 并输出
Random r=new Random();
int[] arr=new int[10];
int min=324;
for (int i = 0; i < arr.length; i++) {
arr[i]=r.nextInt(258)+67;
if (min > arr[i]){
min=arr[i];
}
}
System.out.println("数组中最小值:"+min);//堆内存包含方法(内存)区
//引入数据类型主要存在堆内存中
//例如:
//int[] arr={1,2,3};
//首先在栈内存生成int[] arr;
//然后再通过栈内存的内存地址到堆内存中引入(寻址)
//栈内存是内存区内最小的
//基本数据类型存在栈内存中
// 例如:
// int a=20;
// 栈内存中 int a=20;
//所有的自变量都存在都存在堆内存
//除String
//String s="你好";
//首先在栈内存生成 String s;
//然后再在堆内存的方法区生成内存(寻址) 内存地址:"你好"
//例如:
//int[] arr={1,2,3};
//int[] arr1=arr;
//将 arr的内存地址赋值arr1;
//如果arr的值变了 arr1也跟着变 //随机数
Random r=new Random();
//0-9随机
r.nextInt(10);
//输出随机数
//0-(10-1); while是最基本的循环,它的结构为:
while(布尔表达式){
//循环内容
}只要布尔表达式为 true,循环就会一直执行下去。
对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
do {
//代码语句
}while(布尔表达式);注意: 布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
虽然所有循环结构都可以用 while 或者 do...while表示,但 Java 提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。
for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化; 布尔表达式; 更新){
//代码语句
}关于 for 循环有以下几点说明:
Java5 引入了一种主要用于数组的增强型 for 循环。
Java 增强 for 循环语法格式如下:
for(声明语句 : 表达式){
//代码句子
}声明语句: 声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。
break 的用法很简单,就是循环结构中的一条语句:
break;continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
continue 就是循环体中一条简单的语句:
continue;