访问控制权限、抽象类~内部类
一、访问控制权限
1、访问控制权限修饰符
2、javaBean规范
属性要尽可能的私有化,但是要让它在其他类中可以访问值,需要提供相应的get方法和set方法。
3、static关键字
static是java中非常重要的关键字之一,其基本作用是:方便在没有创建对象的情况下来进行调用方法/变量。其用法主要有四种,分别是修饰属性(称之为静态变量或类变量),修饰方法,修饰代码块,静态导包。
static关键字的使用 |
||||
|
①修饰属性 |
②修饰成员方法 |
③修饰代码块 |
④静态导包 |
含义 |
这个属性不再是对象的属性了,属于类的属性,是公有的资源,任何对象都可以访问 |
属于类的方法,而不是对象,可以直接使用类名.方法名进行调用 |
该代码块在加载期间就已经执行了,只执行一次,即在创建对象之前就已经执行了,一般用来加载静态资源 |
不太常用,采用static导入包后,在不与当前类的方法名冲突的情况下,可以直接采用方法名去调用类方法 |
存储位置 |
方法区(而正常属性存在于堆中) |
方法区 |
|
|
实例:①
②
上述实例中方法toSta( )用static修饰,直接用方法.toSta( )调用即可。
③
当没有创建对象,直接使用类名调用static方法之前,static类成员就已经初始化了。当完成了类成员的初始化,static类成员没有再次初始化。
④将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
final关键字的使 |
||||
|
修饰属性 |
修饰方法 |
修饰方法参数 |
修饰类 |
含义 |
在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。 |
用final关键字修饰方法,它表示该方法不能被覆盖。关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。 |
可以在方法的参数前面添加final关键字,它表示在整个方法中,我们不能改变参数的值。 |
用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的。 |
4、final关键字
二、抽象类
1、概念
用abstract修饰的类就是抽象类,不能被实例化,但存在构造器。方法可以没有方法体,但必须使用abstract修饰,叫抽象方法。
2、抽象类与类的区别
抽象类中可以有抽象方法和普通方法,可以有构造器和属性。类中不能有抽象方法。即有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法。
抽象类可以被继承,如果子类是一个普通的类,那么应该重写父类的抽象方法,写出{};如果子类是一个抽象类,则符合抽象类的特点即可。
三、接口:interface
是特殊的抽象类。特殊在:如果有方法,一定是抽象方法,abstract关键字可以省略;如果有属性,一定是常量,常量的修饰词:public static final(可以省略不写),常量的名字全都大写。没有构造器,不能实例化。
接口其实是一种协议、标准。
类、抽象类与接口的区别 |
|||
|
类 |
抽象类 |
接口 |
定义 |
类是具有共同特征和共同行为的事务 |
用abstract修饰的类 |
特殊的抽象类,用interface声明 |
构造器 |
默认提供无参,手动提供后,默认无参失效 |
不能被实例化,但存在构造器 |
没有构造器,不能被实例化 |
属性 |
可以是任意类型 |
可以是任意类型 |
属性一定是常量,默认修饰词public static final |
方法 |
可以是任意类型 |
可以有抽象方法和普通方法 |
不可以有普通方法, |
继承 |
可以被继承 |
可以被继承:如果子类是普通方法,应该重写父类的抽象方法;如果子类是抽象方法,符合其特点即可 |
被实现,一个实现接口的类必须实现其所有方法,支持多继承 |
四、面向对象的三大特征
继承,封装,多态。
1、继承的好处:可以不用修改一个类,而利用继承的特点,扩展这个类,生成一个子类,有利于二次开发。
2、封装的好处:提高代码的重用性,减少代码的可见性,相对安全。
3、多态:包括对象的多态和变量的多态。
对象的多态:子类的对象被不同的父类型引用。即不同父类型的引用指向同一个对象。
变量的多态:(向上造型)父类型的变量指向不同子类的对象,方法相同行为不同。即同一个变量指向不同子类的对象。
4、向上造型:父类型的变量指向子类型的对象。
在编译期间,变量调用的方法是父类型中的。在运行期间,如果调用的方法子类中重写了,那么一定是重写后的;如果没重写,那么调用的是父类中的方法。
变量调用的属性:一定是父类型中的属性。
总结:属性是绑定到变量上,重写方法是动态绑定到对象上。
(属性看变量类型,方法看对象类型)
5、向下转型:将父类型的变量,转换成子类型的变量。
Aoo a = new Boo();
Boo b = (Boo)a;
有可能会出现ClassCastException,如:
Aoo a = new Coo();
Boo b = (Boo)a;
编译期间:javac.exe只检查代码的语法是否正确。为了避免这种情况发生,需要使用instanceof进行判断,判断变量所指的对象是不是同一类型。
上述代码改为:
Aoo a = new Coo();
if(a instanceof Boo){
Boo b = (Boo)a;
}
五、内部类
1、定义:一个类内部定义的类型。
2、类型:静态内部类、成员内部类、局部内部类、匿名内部类。
内部类 |
|||
成员内部类 |
局部内部类 |
静态内部类 |
匿名内部类 |
在一个类中直接定义的类 |
在方法中定义的内部类 |
在内部类的声明前面加static关键字 |
一种特殊的局部内部类,没有类名 |
内部类中有一个隐藏的引用指向外部类对象,可以访问外部类的所有属性和方法,而外部类不能直接访问内部类的成员,可以通过内部类对象访问。 |
与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。其他用法和成员内部类相同。 |
不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。 |
匿名内部类是一种特殊的局部内部类,这种内部类没有类名。该类适用于只使用一次并且不需要多次创建对象的类。使用匿名内部类可以使类代码与创建对象同时完成,这样做不但方便,还提高代码的可维护性。 |
3、作用:①内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。②内部类拥有外围类的所有元素的访问权限。③可是实现多重继承。④可以避免一个类继承父类实现接口中两种同名方法的调用。
六、API:(application programming interface)
应用程序编程接口,就是开发文档。
1、含有常用的API(),常用的包:java.lang包,java.util包:Scanner,java.math,日期Date,Canlender,java.net包,socket套接字等;java.io:输入输出流等。
2、注释三种:①文档注释:/** */一般写在类和方法前面,生成手册时;②多行注释:/* */;③单行注释://。
3、String类型
特点:类型是用final修饰的,底层是字符数组和其对数组的一些操作。创建出来的对象不可变。但是声明的变量可以指向不同的对象。在使用String类型,提供了字符串常量池。
常量池:在给字符串的变量赋值时,先去常量池中寻找这个对象,如果有,就把这个对象的地址信息给变量,如果找不到,就新建一个对象放进常量池里。有利于对象的重用性。这样的对象必须是字符串字面量,或者是字面量之间的拼接操作。字符串的字面量拼接是在编译期间拼接出结果。