java语言中的访问控制权限修饰符
- 访问控制权限修饰来控制元素的访问范围。
- 访问控制权限修饰符包括:
- public 表示公开的,任何位置都可以访问。
- protected 同包、子类,可以访问。
- 缺省 同包,可以访问。
- private 表示私有的,只能在本类中访问。
访问控制修饰符 | 本类 | 同包 | 子类 | 任意位置 |
---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不行 |
缺省 | 可以 | 可以 | 不行 | 不行 |
private | 可以 | 不行 | 不行 | 不行 |
-
访问控制权限修饰符可以修饰类。变量。方法...
-
当某个数据只希望子类使用,使用protected进行修饰。
-
修饰符范围: private < 缺省 < protected < public。
-
类只能采用public和缺省的修饰符进行修饰。【内部类除外】
java语言中的this关键字
1,this关键字描述
- this是一个关键字,翻译为:这个
- this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在jvm堆内存java对象内部。
- 创建100个java对象,每一个对象都有this,也就是说有100个不同的this
- this可以出现在"实例方法"当中,this指向当前正在执行这个动作的对象。(this代表当前对象)
2,实例方法和实例变量
- 没有static关键字的方法称为"实例方法"
- 没有static关键字的变量称为"实例变量"
- 在带有static的方法中不能直接访问实例方法和实例变量,因为实例变量和实例方法都需要对象的存在。
- 而static/静态方法当中是没有this的,也就是说当前对象是不存在的。自然也是无法访问当前对象的实例方法和实例变量。【this不能在静态方法中使用】
3,this关键字什么时候不能省略?
- 当区分局部变量和实例变量的时候,"this."不能省略。
4, this关键字的使用
- 可以使用在实例方法当中,代表当前对象。【语法格式:this.】
- 可以使用在构造方法当中,通过当前的构造方法调用其他的构造方法。[语法格式:this(实参);]
- this(实参);这种语法只能出现在构造函数第一行。
PS/注意:当一个行为/动作执行的过程当中是需要对象参与的,那么这个方法一定要定义为"实例方法",不要带static关键字。
代码示例:
public class HelloWorld {
public static void main(String[] args) {//表示定义一个公开的静态的主方法 ps:程序执行入口
User u = new User();
u.name = "huangSan";
// 使用this 实例方法调用
u.shopping();
// 普通方法调用
User.doSome(u);
User u2 = new User();
u2.name = "huang333";
// 使用this 实例方法调用
u2.shopping();
// 普通方法调用
User.doSome(u2);
// HelloWorld.doOther();// 编译错误 实例方法必须先创建对象,通过"引用."的方式访问
// doOther是实例方法,实例方法调用必须有对象的存在。
// 但由于main方法中没有this,所以以下方式不能调用
// doOther();
// this.doOther();
// 正确的调用方式:
HelloWorld hw = new HelloWorld();
hw.doOther();
}
// 实例方法
public void doOther(){
System.out.println("do Ohter!");
// doOther实例方法,调用doOther方法一定是创建过对象的,才能调用。
// 在大括号中的代码执行过程中一定是存在"当前对象"的
// 也就是说这里一定是有"this"的
doRun();
// this.doRun(); //完整写法
}
// 实例方法
public void doRun(){
System.out.println("do Run!");
}
}
class User{
String name;
int age;//实例变量
public User(){// 构造方法
}
// 实例方法
public void shopping(){
// 由于name是一个实例变量,所以这个name访问的时候一定访问的是当前对象的name
// 所以多数情况下"this."是可以省略的
System.out.println(name+"在购物");
// 完整写法
// System.out.println(this.name+"在购物");
}
// 带有static的方法
public static void doSome(User c){
System.out.println(c.name+"在购物");
}
}
java语言中的super关键字
1,super关键字描述
- super能出现在实例方法和构造方法中。
- super的语法:"super."、"super()"。
- super不能使用在静态方法中。
- super.大部分情况下是可以省略的。
- super(实参);这种语法只能出现在构造函数第一行,通过当前的构造方法去调用"父类"中的构造方法,目的:创建子类对象的时候,先初始化父类型特征。
- super()和this()不能共存,他们都是只能出现在构造方法的第一行。
- 无论如何,父类的构造方法一定会执行的。
2,super关键字什么时候不能省略?
- 父类中有,子类中也有,如果想在子类中访问"父类的特征,"super."不能省略。
java语言中的static关键字
1,static关键字描述
- static英语单词翻译为静态的
- static修饰的方法是静态方法
- static修饰的变量是静态变量
- 所有static修饰的元素都称为静态的,都可以使用"类名."的方式访问;也可以使用"引用."的方式访问【不建议】
2,什么时候成员变量声明为实例变量
- 所有的对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】
3,什么时候成员变量声明为静态变量
- 所有的对象都有这个属性,并且所有对象的这个属性的值是一样的,建议定义为静态变量,节省内存的开销。
- 静态变量在类加载的时候初始化,内部在方法区中开辟。访问的时候不需要创建对象,直接使用"类名.静态变量名"的方式访问。
4,可以使用static关键字定义"静态代码块"
- 语法格式: static{ java语句;}
- 静态代码块在类加载时执行,并且只执行一次。
- 静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行。
- 静态代码块的作用是什么?怎么用?用在哪?什么时候用?
- 和具体需求有关,例如项目中要求自类加载时执行代码完成日志的记录。那么这段记录日志的代码就可以编写到静态代码当中,完成日志记录。
- 静态代码块是java为程序员准备一个特殊的时刻,这个特殊时刻被称为:类加载时刻,若希望在此刻执行一段特殊的程序,这段程序可以直接放到静态代码块当中。
- 通常在静态代码块当中完成预备工作,先完成数据的准备工具,例如:初始化连接池,解析xml配置文件 ...
5,实例代码块/代码块
- 实例代码块可以编写多个,也是遵循自上而下的顺序依次执行
- 实例代码块在构造方法执行之前执行,构造方法执行一次,实例代码块对应执行一次
- 实例代码块也是java语言为程序员准备的一个特殊时刻,这个特殊时刻被称为:对象初始化时刻。
6,方法什么时候定义为静态的?
-
方法描述的是动作,当所有的对象执行这个动作的时候,最终产生影响是一样的,那么这个动作已经不再属于某一个对象的动作了,可以将这个动作提升为类级别的动作,模板级别的动作。
-
静态方法中无法直接访问实例变量和实例方法。
-
大多数方法都定义为实例方法,一般一个行为或者一个动作在发生的时候,都需要对象的参与。
但是也有例外,例如:大多数“工具类”中的方法都是静态方法,因为工具类就是方便编程,
为了方便方法的调用,自然不需要new对象是最好的
demo代码示例:
public class HelloWorld {
static {// 静态代码块
System.out.println("类加载--> 静态代码块");
}
{// 实例代码块
System.out.println("-> 实例代码块");
}
public HelloWorld(){// 构造函数/方法
System.out.println("-> 构造函数");
}
public static void main(String[] args) {//表示定义一个公开的静态的主方法 ps:程序执行入口
System.out.println("类加载--> main");
new HelloWorld();
new HelloWorld();
}
}
java语言中的final关键字
关于java语言当中final关键字:
- final是一个关键字,表示最终的,不可变的。
- final修饰的类无法被继承。
- final修饰的方法无法被覆盖。
- final修饰的变量一旦赋值之后,不可重新赋值。
- final修饰的实例变量,必须手动赋值,不能采用系统默认值。
- final修饰的实例变量,一般和static联合使用,被称为"常量"。
- 常量名建议全部大写,每个单词之间采用下划线衔接。
- public static final (类型) A_B_C = "" ;
- final修饰的引用,一旦指向某个对象之后,不能再指向其他对象,被指向的对象无法被垃圾回收器回收。
- final修饰的引用虽然指向某个对象之后不能再指向其他对象;但是所指对象内部的内存/属性是可以修改的。
demo代码示例:
public class HelloWorld {
// 实例变量有默认值 final修饰的变量一旦赋值不能重写赋值
// java语言规定实例变量使用final修饰之后,必须手动赋值,不能采用系统默认值。
// final int i ; //编译报错
// 第一种写法
final int i = 100;
//第二种写法
final int num;
public HelloWorld(){
this.num = 200;
}
// 以上两种写法本质上是一种方式,都是在构造方法执行过程中给实例变量赋值。
public static void main(String[] args) {//表示定义一个公开的静态的主方法 ps:程序执行入口
// 创建用户对象
final User u = new User(100);
// u = new User(50);// final修饰的引用,一旦指向某个对象之后,不能再指向其他对象,被指向的对象无法被垃圾回收器回收。
System.out.println(u.getUserId());//100
u.setUserId(50);//final修饰的引用虽然指向某个对象之后不能再指向其他对象;但是所指对象内部的内存/属性是可以修改的。
System.out.println(u.getUserId());//50
System.out.println(Chinese.GUO_JI);
}
}
class Chinese{
//需求:每个中国人的国籍都是中国,国籍不会发生改变,为了防止国籍被修改,建议使用final修饰;
// final修饰的实例变量是不可变的,这种变量一般是和static联合使用,被称为"常量"。
// 常量的语法格式: public static final 类型 常量名 = 值 ;
// java规范中要求所有的常量名字全部大写,每个单词之间使用下划线连接。
// static final String country = "中国";
public static final String GUO_JI = "中国";
}
class User {
private int userId;
public User(int userId) {
this.userId = userId;
}
public User() {
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
}
java语言中的package和import
1,关于java语言当中包/package的机制:
- 1,包有被称为packgae,java中引入package这种语法机制主要是为了方便程序的管理。不同功能的类被分门别类放到不同的软件包当中,查找方便,管理方便,易维护。
- 2,怎么定义package
- 在java源程序的第一行上编写package语句。
- package只能编写一个语句。
- 语法结构:package 包名;
- 3,包名的命名规范:
- 公司域名倒序 + 项目名 + 模块名 + 功能名 ;
- 采用这种方式重名的几率较低,因为公司域名具有全球唯一性。
- 4,包名要求全部小写,包名也是标识符,必须遵守标识符命名规则。
- 5,一包对应的是一个目录。
- 6,使用了package机制之后,怎么编译?怎么运行?
- 使用了package机制之后,类名不再是Test01了,类名是:com.simon.javase.test.Test01
代码示例:
package com.simon.javase.test;
public class Test01 {
public static void main(String[] args) {//表示定义一个公开的静态的主方法 ps:程序执行入口
System.out.println("com.simon.javase.test.Test01");
}
}
2,关于java语言当中import:
- import语句用来完成导入其他类,同一个包下得类不需要导入,不在同一个包下需要手动导入。
- import语法结构:
- import 类名;
- import 包名.*;
- import语句需要编写在package语句之下,class语句之上。
- 什么时候需要import?
- 不是java.lang包下,并且不在同一个包下得时候,需要import进行引入。
代码示例:
//import com.simon.javase.test.Test01;
import com.simon.javase.test.*;
public class HelloWorld {
public static void main(String[] args) {//表示定义一个公开的静态的主方法 ps:程序执行入口
Test01 t = new Test01();
}
}
网友评论