Java之面向对象(下)
static关键字
static修饰三类成员:
(1)成员变量,(2)代码块:在类加载时期完成变量或代码块的初始化 。(3)方法:得调用才执行。
2. final关键字
final不论修饰一下三种的那一种,它的作用都是最终的意思。
修饰变量:可以修饰成员变量,也可以修饰局部变量,如果修饰成员变量,在声明的同时必须初始化,如果修饰局部变量,可以先声明,后初始化。变量的值一旦确定,不可以被修改。
修饰方法:作用:表示方法是不可变的。体现在:方法不可以被重写。
修饰类:作用:表示此类时不可变的。体现在:类不可以被继承。
static final 修饰成员变量 – 常量。 例如:static final int A = 23;
常量命名规则:1. 常量名需要全部大写,如果是由一个单词组成,所有字母大写,如果由多个单词组成,所有
字母大写,多个单词之间用_隔开。
2. 通常常量的访问控制修饰符都是public 。作用:在程序中经常会出现一些值固定不变的量,此时就需要将他们定义成常量。
注意点:static final常量会在编译期被替换。
3. 抽象:abstract
抽象方法:只有方法的声明,没有方法体,就叫做抽象方法。如果一个类中有抽象方法,那么这个类也一定是抽象类。
抽象类 :基于父类的。 意义:为其子类提供一个公共的模板。抽象类是用于被继承的。
二者关系:一个类中如果有抽象方法,那么这个类一定是抽象类,如果一个类是抽象类,这个类中不一定有抽象方法的。
抽象类的用法:
一个类继承抽象类,如果抽象类中有抽象方法,那么此类要么全部重写父类中的抽象方法,要么此类也成为抽象类。
注意点:
- 抽象类中有构造方法,但是抽象类不可以实例化
2. abstract和final不可以同时修饰一个类
接口:interface
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象 类”——接口(interface),接口中的所有方法都是抽象方法。
用法: 实现类 implements 接口 实现类中(非抽象类)必须全部重写接口中的抽象方法,接口可以用来做引用类型,可以通过一个接口类型的引用指向它的一个实现类对象。 (向上造型)。
接口中的成员:(1)常量 (2) 抽象方法
常量:public static final 数据类型 常量名 = ; 接口中定义常量时可以写成: 数据类型 常量名 = value; 原因:接口给所有定义的常量提供默认的修饰符:public static final。
接口中定义抽象方法时可以写成: 返回值类型 方法名(参数列表)。
原因: 接口中为所有的方法提供了默认的修饰符:public abstract。
注意点: 接口中没有构造器,不可以被实例化,但是可以作为引用类型。
抽象类和接口在java中的具体使用: abstract class User implements Interface: 重写多个子类中实现相同的方法,实现不同的方法不重写,继续作为抽象方法存在。
特点: 1.多实现 interface A,B,C
class D implements A,B,C
注意点: Java类的继承只能是单继承,而接口的实现可以是多实现。
java中接口的出现是对类单继承特点不足做出的弥补
2.java中继承和实现可以一起使用,即一个子类在继承一个父类的同时还可以实现多个接口中的内容,但 是一定是继承在前,实现接口在后。
3.接口的继承:接口之间是可以继承的,而且是可以多继承的。
interface A ,B,C
A extends B,C
接口不能实例化
抽象类和接口的比较: 1.抽象类中有构造器,而接口中没有,但是两者都不能实例化 2.抽象类中可以有变量,可以有常量,而接口中只能有常量 3.抽象类中可以有抽象方法,也可以有普通方法,而接口中只能有抽象方法 4.抽象类和接口都可以用于继承,但是抽象类的继承是单继承,接口的继承是多继承。
3. 内部类
• 在一个类Outter的内部,定义一个类Inner,此时这个Inner类就是一个内部类,Outter类是外部
类。
class Outter{
class Inner{
}
}
Inner定义在Outer的内部。
内部类的作用:场景:某一个类的出现只是服务于一个类的,这种情况通常就将这个类定义为内部类 ,
内部类Inner可以直接调用外部类Outer的成员及方法(包括私有的), 内部类是外部类的成员,此时可以访问到其他成员。
普遍内部类:
public class Outter{ int a; public void test(){}
private class Inner{ int b; public void demo(){} } } 注意点:内部类的访问控制修饰符可以4种的任意一种
普通内部类的访问: 访问内部类中的成员。内部类因为通常是服务于此外部类的,所以内部类的访问通常都是在外部类中 (方法中)完成。
内部类是非pairvate控制修饰符修饰的: 代表此内部类可以被外部访问到。 外界访问内部类方式
Outter outter = new Outter();
Inner inner = outter.new Inner();
或 Inner inner = new Outter().new Inner();
局部内部类:内部类定义在了外部类中方法的方法体中。 局部:外部类中的方法
/* * 局部内部类: * 内部类定义在外部类中方法的方法体中 */
public class InnerDemo {
public void demo(){
int a = 4;
//定义内部类
class Inner{
public void test(){
System.out.println(a);
System.out.println(“执行局部内部类中的方法!”);
}
}
//创建此内部类的对象并访问
Inner cls = new Inner();
cls.test();
}
public static void main(String[] args) {
InnerDemo de = new InnerDemo();
de .demo();
}
}
注意点: 局部内部类中访问所在方法的局部变量,从JDK1.8开始可以直接访问,但是1.8之前,必须在局部 变量前+final才可以访问。
匿名内部类: 使用场景: 如果现有一个类要实现接口或继承父类,而这个类没有定义,现在要使用此类的对象,但是此类 只在这个位置使用,其他类不使用,可以采用匿名内部类实现。 前提:此匿名内部类必须实现接口或继承父类 写法:接口/父类 引用 = new 接口/父类(){ //匿名内部类的类体 重写抽象方法 } 接口。
匿名内部类在java中的常见用法: 一个方法的参数列表中的参数是接口或抽象类,调用此方法时通常需要传递一个匿名内部类对象作为实参。
3.多态
一个类型的引用在指向不同的对象时会有不同的实现
class Person{
public void sayHi(){输出hello}
}
class Student extends Person{
@Override
Public void sayHi(){输出hi}
}
class Teacher extends Person{
@Override
Public void sayHi(){输出哈喽} }
class Test{
main:
Person per = new Student();
Person per1 = new Teacher();
per.sayHi(); //hi
per1.sayHi(); //哈喽
}