Java 面向对象(OOP)关键字

目录

 

Java 面向对象(OOP)关键字

包package和import

包的作用

包的使用

Java中常用的包

this  super

final

静态static关键字

 


Java 面向对象(OOP)关键字

包package和import

为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。

包的作用

  • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

  • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

  • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

声明包中的类 package
 
语法: package 包名称 ;
 
声明包要求是源代码文件的第一个语句
 
程序中最多只能有一条 package 语句 , 没有包定义的源代码文件成为默认包中的一部分 :
 

包的使用

如果其他人想使用包中类,则需要使用全名。
为了简化书写, Java 提供了 import 语句: import package_name.*;
引入包中的类: import 包名称 . 类名称 ; 例如 import java.util.Date;
引入整个包; import 包名称 .* ; 例如 import java.util.* ;
不引入包而是用类,则需要是用类的全名: 包名 . 类名 , 例如 java.util.Date dd=new java.util.Date();

Java中常用的包

java.applet  用于提供 Applet 开发的支持 , 目前已经被 flash 所替代,很少使用,只有在某些地图系统中还有使用
java.awt javax.swing   用于单机软件或者 c/s 应用中的界面开发
java.io   用于输入、输出操作
java.lang    语言包 , 默认自动加载的包
java.net    用于网络编程
java.util    工具包,是 Java 提供的一些工具类
 

开发者可以自己把一组类和接口等打包,并定义自己的包。而且在实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。

由于包创建了新的命名空间(namespace),所以不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。

this  super

this用于指代当前对象;super用于指代父类对象。

super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

this三大作用:

this调用属性、调用方法、this是自身的一个对象,代表对象本身。

this. 成员属性(方法)用于表示当前对象的某个成员,一般用于局部变量和属性名称一致的场景下。
 
super. 成员属性(方法)用 于表示父类中定义的某个属性,一般用于子类中覆盖定义了某个父类属性的场景下。

 

引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

this()表示调用另外一个构造器,super()表示调用父类中的某个构造器,()中的参数决定调用的是哪个构造器。

当定义构造器时,如果构造器方法中第一句不是this()或者super()时,默认第一句就是super()表示调用父类的构造器
package extend;

public class Main0 extends ss {

	public Main0() {
		super(2); //必须在构造函数的第一行 调用就近父类的构造方法,参数决定是父类的那个构造方法
		System.out.println("调用ss方法!");

	}

	public static void main(String[] args) {

		// ss a = new ss(2);
		Main0 aa = new Main0();

		System.out.println("asdaff");
	}
}

class ss {
	int a;

	public String ss(String s) {
		String a = "aaaaaa" + s;
		System.out.println("调用ss方法!父类");
		return a;
	}

	public ss(int a) {
		this.a = a;
		System.out.println("调用ss有参构造方法!" + a);

	}

	public ss() {
		System.out.println("调用父类ss无参构造方法");
	}
}
/*
小知识点:
class dd extends ee{

	public dd(int a) {//必须要写的构造器
		super(a);//必需调用有参的
	}
	
}
class ee{
	public ee(int a){
		
	}
}
*/

final

意思是最终的、不可变的。
 
final 修饰成员变量时,成员变量被必须初始化,并且不能被修改。初始化可以定义 final 变量时直接初始化或者在当前类构造函数中 初始化局部变量只需要保证在使用之前被初始化赋值即可。
 
final 修饰方法则该方法不能被子类重写。
 
final 修饰一个类 , 则该类不能被继承。
 
通过private构造器也达到了类似的不允许继承的效果,但是要求类中的所有构造器都是私有。
 
表示字串的 3 种类型 String StringBuffer StringBuilder 都是 final 类型的类,所以都不允许继承。
 
引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
package extend;

public class Final {
	public  static  String  A="abc";
	
	public static void main(String[] args) {
	final	Final a  = new Final(); //被final修饰的引用变量 a,
	     System.out.println(A);//输出 a的旧内容
		a.A="ddd";
		System.out.println(A); //输出 a的新内容
		System.out.println(a);  //a的地址不变
	}

}

静态static关键字

用于修饰成员,包括成员属性【类属性或者静态属性】、成员方法【类方法或者静态方法】
 
随着类加载,随着类消失。
 
优先于对象,用类名直接访问。
 
静态属性
 
static 属性是当前类的所有对象所共有的共同属性 ( 只有一个,而普通属性各个对象都有自己的,相互隔离 ) ,任何一个当前类对象修改这个属性,所有其他类对象的这个属性都会受影响。
 

静态方法

因为可以直接使用 类名 . 方法名 的形式直接调用静态方法,静态方法执行时很有可能并没有构建对象,所以在静态方法中不允许使用 this/super 之类用于指定对象的关键字。
当然在静态方法中允许创建对象,并调用对象方法。
静态方法只能直接访问静态成员,不能直接访问非静态成员。
 
静态块
 
类在执行时需要通过一个叫作类加载器的组件将程序加载到内存中,类在运行时一般不会发生变化,所以类不会频繁加载,在整个运行过程中只加载一次,而且常驻内存。
 
静态块在类加载完毕后自动执行,而且只执行一次。
 
非静态块
 
非静态块在类内且在所有的方法之外,非静态块并不会在类加载后自动执行,而是在构建当前对象时自动执行。
 
new 一次则会执行一次,执行时机在构造器之前执行。
 
  • 当类加载完毕会自动优先处理static属性和static块,这两个优先级是相同的,所以谁在前先处理谁;
  • new对象时,处理非静态属性和非静态块,这两个优先级是相同的,所以谁在前先处理谁 ;
  • 最后执行构造器。

父类中定义的静态方法(类方法)可以通过子类名.静态方法名的方式进行调用。

父类中定义的静态方法(类方法)可以在子类中进行覆盖定义(重写)。

静态块没有覆盖定义的概念,如果父子类中都定义了静态块,一定是先执行父类中的静态块,然后运行子类中的静 态块。
 

      加载顺序为先父后子---先执行父类中定义的静态属性和静态块。     

      然后执行父类初始化操作---先处理父类中的成员属性和非静态块,再执行父类构造器;最后执行子类的定义内容。

package extend;

public class JingTai extends AA {//加载父类static代码块,在加载子类static代码块 类加载时期完成
	static {
		System.out.println("输出子类静态代码块。");
	}

	{
		System.out.println("输出子类非静态代码块。");
	}

	public JingTai() {
		System.out.println("调用子类构造方法。");
	}

	public static void main(String[] args) { // 子类静态方法
		 AA a = new AA(); //创建父类对象
		 System.out.println();
		 JingTai aa = new JingTai(); // 创建子类对象,先创建父类对象调用父类非静态代码块,父类构造方法

	}
}

class AA {
	static { // 静态代码块
		System.out.println("输出父类AA静态代码块的内容!");
	}

	{ // 非静态代码块
		System.out.println("输出父类AA非静态代码块内容。");
	}

	public AA() {
		System.out.println("调用父类构造方法。");
	}
}

输出结果:

输出父类AA静态代码块的内容!
输出子类静态代码块。
输出父类AA非静态代码块内容。
调用父类构造方法。

输出父类AA非静态代码块内容。
调用父类构造方法。
输出子类非静态代码块。
调用子类构造方法。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值