类的封装
面向对象编程的核心思想,将对象的属性和行为封装起来,类就是其载体
类的继承 (子类可直接使用父类方法和属性)
让一个类继承另一个类,使用extends关键字
类1 extends 类2
java中的类只支持单继承,即一个子类只能继承一个父类
方法的重写
1.重写的实现
继承并不只是扩展父类的功能,还可以重写父类的成员方法
可以父类声明,子类实现,执行子类方法中的代码
父类 对象=new 子类();
2.super关键字
(this关键字代表本类对象,super关键字:如果子类重写了父类的方法还想调用父类的方法,可用super关键字)
使用方法:
super.property; //调用父类的属性
super.method(); //调用父类的方法
如果在子类构造方法中使用类似super()的构造方法,其他代码只能写在super()之后,不能写在前面,否则会报错
object类
在java中,所有的类都直接或间接继承了java.lang.object类,object类是比较特殊的类,它是所有的类的父类,是Java类层中的最高层类。
重要方法:
(1) getClass()方法
返回对象执行时的class实例,然后使用此实例调用getName()方法可以取得类的名称
getClass().getName();
(2)toString()方法
将一个对象返回为字符串形式,它会返回一个String实例
3.equals()方法
此方法默认实现是使用“==”运算符比较两个对象的引用地址,而不是比较对象的内容
类的多态 (一种定义多种实现)
体现在两方面:
(1)方法的重载
(2)类的上下转型
1.方法的重载
在同一个类中可以同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可
(例:构造方法名称由类名决定,可以有多个构造方法同时存在)
2.向上转型 (具体转抽象)总是安全的
把子类对象赋值给父类类型的变量(类似父类声明子类实现)
3.向下转型 (抽象转具体) 具有一定的危险性
显示类型转换:将父类对象强制转换为某个子类对象
父类 a=new 子类();
子类 b=(子类)a;
4.instanceof关键字 (返回值为布尔值)
用来判断一个类是否实现了某个接口,也可以用它来判断一个实例对象是否属于一个类
myobject instanceof ExampleClass; //myobject:某类的对象引用,ExampleClass:某个类
抽象类与接口
在多态机制中,并不需要将父类初始化对象,需要的只是子类对象,所以在java语言中设置抽象类不可以实例化对象,
定义抽象类使用abstract关键字
[权限修饰符] abstract class 类名{
类体
}
抽象方法
[权限修饰符] abstract 方法返回值类型 方法名(参数列表);
抽象方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上,抽象类除了被继承外没有任何意义
构造方法不能被定义为抽象方法,继承抽象类的所有子类都需要将抽象类中的抽象方法进行重写
接口 (使用interface关键字)
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体
[修饰符] interface 接口名 ([extends 父类接口名列表]){ //若使用了extends父类接口名为必选参数
语句
}
一个类实现一个接口可使用implements关键字
public class 子类 extends 父类 implements 接口
在接口中定义的任何变量都自动是static和final的,因此,在接口中定义变量时,必须进行初始化,而且实现接口的子类不能对接口中的变量重新赋值,且要重写接口中的方法
多重继承:在java中不允许多重继承,但使用接口就可以实现
class 类名 implements 接口1.接口2,接口3·······
接口继承接口,使用extends关键字
访问控制
声明类时,如果没有使用public修饰符设置类的权限,则这个类默认为default(缺省)修饰
java类包
java.lang.Math java.lang:包的名称,Math:类的名称
类包不仅可以解决类名冲突问题,还可以在开发庞大的应用程序时,帮助开发人员管理庞大的应用程序组件,方便软件复用, 同一个包中的类相互访问时,可以不指定包名,java包的命名规则是全部使用小写字母,另外由于包名能转换为文件的名称,所以包名中不能包含特殊字符
final关键字
1.final类
若果希望一个类不允许任何类继承,并且不允许其他人对这个类进行任何改动,可以将这个类设置成final形式
final class 类名{}
2.final方法(不能被重写)
可防止子类修改该类的定义与实现方式,同时定义final的方法的执行效率要高于非final方法
3.final变量 (不是恒定不变的,将随机数赋予定义为final的常量,每次运行都会改变)
通常由final定义的变量为常量
例:final double PI=3.14;
内部类(在类中再定义一个类) 可节省编译后产生的字节码,内外部类不能同命,内部类可互相调用
1.成员内部类
内部类可以随意使用外部类的成员方法以及成员变量,但内部类成员只有在内部类的范围是可知的,不能被外部调用,内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象
实例化内部类对象
OuterClass out=new OutClass();
OuterClass.innerClass in=out.new innerClass();
2.内部类向上转型为接口
(1)可完全隐藏内部类的具体实现过程
(2)可以定义多个内部类,以不同的方式实现接口中的同一个方法(一个接口可以由多个内部类实现)
(3)这种技巧经常被应运在swing编程中,可以在一个类中做出不同的响应事件
3.使用this关键字获取内部类与外部类的引用
若果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
public class TheSameName{
private int x;
private class Inner{
private Int x=9;
public void doit(int x){
x++; //调用的是形参x
this.x++; //调用内部类的变量x
TheSameName.this.x++; //调用外部类的x变量
}
}
}
局部内部类
内部类不仅可以在类中定义,还可在类的局部位置定义,如在类的方法或任意的作用域中均可以定义内部类
作用域太小,不利于多次复用
匿名内部类 (没有名称,使用默认构造方法来生成对象,但其没有构造方法)
return new A(){ //A:类名
···//内部类体
}; //分号:代表创建对象引用表达式的标识
静态内部类 (内部类前加static修饰符)
特点:
(1)若果创建静态内部类的对象,不需要创建其外部类的对象;
(2)不能从静态内部类的对象中访问非静态外部类的对象
内部类的继承
内部类和其他普通类一样可以被继承,但继承内部类比继承普通类复杂,需要设置专门的语法来实现
public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB
public OutputInnerClass(Class a){
a.super();
}
}
class ClassA{
class ClassB{
}
}
在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数必须是该内部类的外部类引用