1、private
private:私有,权限修饰符,用于修饰类中的成员(
成员变量,成员函数)。
私有只在本类中有效,类外无法访问(即使在类外建立类的对象也无法直接访问,但可在本类中提供访问私有的方式,set get方法,之所以对外提供访问方式,就因为可以在访问方式中可以加入逻辑判断等语句,对访问的数据进行操作,提高代码的健壮性)。私有仅仅是封装的一种表现形式。
class Person
{
private int age;
public void setAge(int a)
{
if(a>0&&a<180)
{
age = a;
}
else
{
System.out.println("不正常数字");
}
}
public int getAge(int a)
{
return age;
}
void speak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setAge(20);
p.speak();
}
}
2、static
static关键字,是一个修饰符,用于修饰
成员变量和成员函数。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,格式:
类名.静态成员。
修饰成员变量:在生成对象时,不被修饰的成员变量,存放在堆内存中。对于多个对象中存在的共同数据,可以用static修饰,用static修饰后的成员变量单独存在方法区(或称为共享区、数据区,函数也放在这里),而不存放在堆内存中,可以节省内存空间。此时,多个对象共用一个静态成员变量,多个对象均可调用这个静态成员变量。
特点:
随着类的加载而加载,类一旦被使用,则静态成员就立即存在(成员变量在对象生成时才产生);静态会随着类的消失而消失,静态成员的生命周期最长。静态成员变量也称为类变量。
优先于对象存在
被所有对象所共享
可以直接被类名所调用
实例变量与类变量区别:
存放位置:类变量随着类的加载而存在于方法区中;实例变量随着对象 的建立而存在于堆内存中。
生命周期:类变量生命周期最长,与类同生共死;实例变量与对象同生共死。
静态使用注意事项:
类可直接调用静态方法
静态方法只能访问静态成员变量或静态方法,静态方法中不能调用实例变量
非静态方法可以访问静态成员
静态方法中不可以定义this super关键字,因为静态先于对象而存在(this super 代表的是对象)
主函数是静态的,
但是主函数中可以通过创建对象调用非静态方法,但是不能用this调用非静态方法。
静态优点:对对象的共享数据进行单独空间的存储,节省空间,没有必要每个对象都存储一份。可以直接被类名调用。
静态弊端:生命周期过长;访问出现局限性(静态虽好,但只能访问静态)
3、final
final,最终,作为一个修饰符。可以修
饰类、函数和变量。
类:被final修饰的类不可以被继承,所以如果不想类被继承,可用final修饰
方法:被final修饰的方法不可以被重写。
变量:被final修饰的变量是常量,只能被赋值一次,既可以修饰成员变量也可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时 为了增强阅读性,都会给这些值起个名字方便阅读。而这个值不需要改变,所以加上final修饰,作为常量,常量书写规范:所有字母大写如果由多个单词组成,但此间通过 _ 连接。
另外:内部类定义在类中的局部位置时,只能访问该局部被final修饰的局部变量
class Demo
{
final int x= 2;
final double
MY_PI = 3.14;
final void show1()
{
}
void show2()
{
}
}
class SubDemo extends Demo
{
void show()
{
}
}
问题:
1、可不可以 final int x; x=2; ? //可以
2、用final修饰的成员不进行初始化,若打印不进行赋值的final成员,编译错误。
class Demo
{
public static void main(String[] args){
//final int x=1; 此方法可以int y = 5;System.out.println(y);final int x;//System.out.println(x);//编译错误,x没有初始化x=3; //可以先不赋值,然后再赋值一次System.out.println(x);
}
}
4、abstract,用于修饰类和方法,即抽象类和抽象方法。
/*
当多个类中出现相同功能,但是功能主体不同,这类可以进行向上抽取,这时,只抽取功能定义,而不抽取功能主题,用abstract。抽象方法必须放在抽象类中,因为若抽象方法放在非抽象类中,类的对象对该抽象方法完全没有意义。
抽象方法:abstract 返回值类型 方法名(); 抽象方法没方法主体
特点:
抽象方法一定存在于抽象类中
抽象方法和抽象类都必须被abstract修饰
抽象类不可以用new创建对象,因为调用抽象方法没意义
抽象类中的方法要被使用,必须由子类重写所有的抽象方法后,建立子类对象来使用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类(抽象方法只能存在于抽象类中)。如果子类重写了父类所有抽象方法,则子类可以不是抽象的。(一般情况下子类都是非抽象的,因此使用抽象类抽象方法,可以在一定程度上强迫子类重写一些抽象方法,因为子类需要创建对象,而抽象类不能创建对象)
抽象类和一般类:
没有太大不同,该如何描述事物就如何描述事物,只不过该事物中出现了一些看不懂的东西,这些不确定的部分也是该事物的功能,需要明确出来,但是无法定义主题。通过抽象方法类表示。
抽象类比一般类多了个抽象方法
抽象类不可以实例化
抽象类中可以存在非抽象方法。
抽象方法和一般方法:
一般方法可以被子类直接使用,若子类需要可以对父类方法进行重写。
抽象方法只定义返回值类型和方法名,没有方法主题,需要由子类重写使用。
*/
abstract class student
{
abstract void study();//抽象方法必须存在于抽象类中
}
class BaseStudent extends student
{
void study()//对抽象方法进行重写
{
System.out.println("study");
}
}
5、修饰变量时,
public final static String name
public static final String name
是一样的,也就是说final 与static 谁前谁后都一样。
总结:
private:成员变量、成员函数。(注意:当内部类在成员位置时,也可以被修饰)
static:成员变量、成员函数。(注意:当内部类在成员位置时,也可以被修饰)
final:变量、函数、类
abstract:类、函数