通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活不符
为了避免上述错误的发生,就需要对成员变量进行密封包装处理,来隐 藏成员变量的细节以及保证成员变量数值的合理性,该机制就叫做封装
私有化成员变量,使用private关键字修饰
提供公有的get和set方法,并在方法体中进行合理值的判断
在构造方法中调用set方法进行合理值的判断
public class Worker extends Person{} - 表示Worker类继承自Person类 其中Person类叫做超类、父类、基类。 其中Worker类叫做派生类、子类、孩子类。
父类类型 引用变量名 = new 子类类型();
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果
.构造方法名与类名完全相同并且没有返回值类型
使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作
class 类名 { 类名(形参列表) { 构造方法体; } }
与参数列表的数量、类型和顺序有关,与修饰符和返回值类型以及抛出异常类型无关
在一个类中为一种行为提供多种实现方式并提高可读性
public class Test3 { public int add(int a,int b){ return a+b; } public int add(int a,int b,int c){ return a+b+c; } }
父类方法无法满足子类的要求,子类通过方法重写满足需求
public class Test4 { public int add(int a,int b){ return a+b; } } class Test5 extends Test4 { @Override public int add(int a, int b) { return a-b; } }
方法自己调用自已
public class Test6 { public static void main(String[] args) { System.out.println(add(100)); } public static int add(int a){ if (a!=1){ return a+add(a-1); }else{ return 1; } } }
访问权限 | 本类 | 本包的类 | 子类 | 非子类的外包类 |
---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
default | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
static是不允许用来修饰局部变量
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
public class Test7 { public static void main(String[] args) { Test8.sleep(); } } class Test8{ public static void sleep(){ System.out.println("sleep~"); } }
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
private static Date startDate,endDate; static{ startDate = Date.valueOf("2000"); endDate = Date.valueOf("2021"); }
当用final修饰一个类时,表明这个类不能被继承。
类的private方法会隐式地被指定为final方法
方法无法被覆盖重写
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但其属性仍可以更改。