Java学习笔记(二)private、protected、public、默认、static、final、abstract修饰符

一、修饰符

1.访问修饰符(access modifiers),如public/private等

成员的访问控制符
  同一个类中 同一个包中 不同包中的子类 不同包中的非子类
private yes      
默认(包可访问) yes yes    
protected yes yes yes  
public yes yes yes yes
  •  public

public即公共的,在Java中public是限制最宽的修饰符,其可修饰类、字段、方法;且可跨类访问,而且可跨包访问

  • default(默认)

若未添加任何修饰符,即为默认访问权限,即包内可访问。用默认修饰符修饰的类、字段、方法,都只能在同一个包内访问

  • private

private即私有的,被private修饰的字段和方法只能被该类的对象访问,其他子类、包都不能访问。且只能修饰内部类,不能修饰外部类(修饰外部类IED会直接报错)

将字段用private修饰,从而更好地将信息进行封装和隐藏,只提供set和get方法对类的属性进行存取,有以下优点:

  1. 属性用private更好地封装和隐藏,外部类不能随意存取和修改。
  2. 提供方法来存取对象的属性,在方法中可以对给定的参数的合法性进行检验。
  3. 方法可以用来给出计算后的值
  4. 方法可以完成其他必要的工作(如清理资源、设定状态)
  5. 若只提供get方法,而不提供set方法,可以保证属性是只读
  • protected

用protected可修饰字段、方法,被修饰的字段、方法和构造器都能被在同一个包内访问,也能被其他包的子类访问(到这里是最高权限了,若在其他包内调用实例化的父类protected的方法,将会出错,只有public才用权限这么做)

二、其他修饰符

  基本含义 修饰类 修饰成员 修饰局部变量
static 静态的、非实例的、类的、 只能修饰内部类 yes  
final 最终的、不可改变的 yes yes

yes

abstract 抽象的、不可实例化的 yes yes  
  • static

1.static字段

他们是类的字段,但不属于任何一个对象实例

保存区域:它不保存在某个对象实例的内存空间中,而是保存在类的内存区域的公共存储单元

访问方式:即可通过类名直接访问(对应着上述特点),也可以通过实例对象来访问,两种方法的结果都是相同的。(如System.in或System.out就是static)

2.static方法

用static修饰符修饰的方法仅属于类的静态方法,又称类方法。而与之相对应的,未用static修饰的方法为实例方法

与static字段类似,类方法的本质是该方法属于整个类的,不属于某个实例

声明一个方法为static有以下几重含义:

  1. 非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用的代码段。而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而进行分配和装载,不被任何一个对象专有
  2. 由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即static方法只能处理本类的static域或调用static方法
  3. static方法中,不能访问实例变量,不能使用this或super
  4. 调用这个方法时,应该使用类名直接调用,也可以用某个具体的对象名(如Math.pow(x, 2)用于计算)

上述说得有点抽象,举点简单的例子:

在eclipse中在一个类中写了一个s错tatic的方法调用实例变量编译器直接报

而在此方法中调用此类的static int id,则是合法可运行的

下面两种情况会使用静态方法:

  1. 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(如Math.pow)
  2. 一个方法只需要访问类的静态域

3. import static

在import 包的前也可加上static修饰符,其含义为导入此包内的静态成员,不需要类名或者任何对象,如:

import static java.lang.System.*;

out.println();
System.out.println();
//上两条语句等价
  • final

1.final类

若一个类被final修饰符所修饰和限定,说明这个类不能被继承,即不能有子类

2.final方法

若一个方法被final修饰符所修饰,则这个方法不能被子类所覆盖

3.final字段及final局部变量

  • final字段、final局部变量(方法中的变量):它们的值一旦给定,就不能更改,且是只读量,能且只能被复制一次,而不能被赋值多次
  • 若一个字段被static final 两个修饰符所限定时,表示其为常量,如Math.PI(圆周率)
  • 赋值时,若定义static final域时,若不给定初始值,则按默认进行初始化;定义final字段时,若不是static的域,则必须且只能赋值一次(可在定义变量时赋初始值,也可在每个构造函数中进行赋值

 

  • abstract

1.abstract类

被abstract修饰符修饰的类被称为抽象类,抽象类是不能被实例化

2.abstract方法

  • 被abstract所修饰的方法叫抽象方法,抽象方法的作用在为所有子类定义一个统一的接口。对抽象方法只需声明,而不需实现,如:abstract void sayHello(String name);
  • 抽象类中可以包含抽象方法,也可以不包含抽象方法,但是若类中有abstract方法,则类也必须声明为abstract
  • 抽象方法在子类中必须被实现,否则子类也是abstract
package hello;

import java.util.Scanner;
import person.Person;

public class Hello 
{

	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Student astu = new Student("Liming");
		astu.sayHello("Xiao Hu");
	}

}

abstract class People
{
	String name;
	
	People(String aName)
	{
		this.name = aName;
	}
	
	abstract void sayHello(String otherName);
	
}

class Student extends People
{
	Student(String aName)
	{
		super(aName);
	} 
	
	void sayHello(String name) 
	{
		System.out.println("Hello " + name + ", I am " + this.name);
	}
}

 

你可能感兴趣的:(Java)