1.类的封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类。
运行结果
运行结果
运行结果
运行结果
2.类的继承:
继承在面向对象开发思想中是一个非常重要的概念,它使整个程序具有一定的弹性,在程序中复用已经定义完善的类不仅可以减少软件开发周期,还可以提高软件的可维护性和可扩展性。
继承其基本思想是基于某父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。
1.extends关键字
在java中,让一个类继承另一个类,用extends关键字
child extends parents//子类继承父类
注意:java中的类只支持单继承,即一个子类只能继承一个父类,类似下面的代码是错误的:
运行结果
从这个结果可以看出,Pad类继承了Computer类之后,虽然没有定义任何成员方法,但仍然可以调用父类的方法,这个方法就是从父类那里继承过来的。
3.方法的重写
继承并不只是扩展父类的功能,还可以重写父类的成员方法。重写(还可以称为覆盖)就是在子类中将父类的成员方法的名称保留。重新编写成员方法的实现内容,更改成员方法的存储权限,或是修改成员方法的返回值类型 (重写父类成员方法的返回值是基于J2SE 5.0版本以上的编译器提供的新功能)。
在继承中还有一种特殊的重写方式,子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。
注意:当重写父类的方法时,修改方法的修饰权限只能从小的范围到大的范围改变,例如,父类中的doSomething()方法的修饰权限为protected,继承后子类中的方法doSomething()的修饰权限只能修改为public,不能修改为private。
运行结果
注意:在java语言中,一个类只可以有一个父类!
super关键字
super关键字可以调用父类的方法和属性,它的使用方法和this关键字相似。但this关键字代表本类的对象,super关键字带调用的是父类的方法
运行结果
Object类——所有类的父类
在java中,所有的类都直接或间接继承了java.lang.Object类。Object类是所有类的父类,是java类层中的最高层类。
1.getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName ()方法可以取得类的名称。
getClass().getName();//调用getClass()里的getName()方法
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法。
3.equals()方法
比较两个对象的实际内容。
运行结果
类的多态
类的多态性指“一种定义,多种实现”,类的多态性可以从两方面 体现:方法的重载,类的上下转型。
方法的重载:重载(不需要继承):返回参数不同、传入参数不同、 方法名相同
运行结果
向上转型:子类转变成父类类型
运行无结果
向下转型:父类转变成子类 使用强制转换
运行结果
instanceof关键字
当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生classcastException异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例。
myobject instanceof ExampleClass//判断是否为该类的实例对象
myobject:某类的对象引用。
ExampleClass:某个类
使用instanceof操作符的表达式返回值为布尔值。
运行结果
抽象类与接口
抽象类与抽象方法:在java中设置抽象类不可以实例化对象。
使用abstract关键字定义的类称为抽象类,而使用abstract关键字定义的方法称为抽象方法。
[权限修饰符]abstract 方法返回值类型 方法名(参数列表);
从上面的语法可以看出,抽象方法是直接以分号结尾的,它没有方法体,抽象方法本身没有任何意义。除非它被重写,而承载这个抽象方法的抽象类必须被继承。
运行结果
使用抽象类和抽象方法时,需要遵守以下原则:
1、在抽象类中,可以包含抽象方法,也可以不包含抽方法,但是包含了抽象方法的类必须被定义为抽象类。
2、抽象类不能直接实例化,即使抽象类中没声明抽象方法,也不能实例化。
3、抽象类被继承后,子类需要实现其中所有的抽象方法。
4、如果继承抽象类的子类也被声明为抽象类,则可以不用实现父类中所有的抽象方法。
接口的声明及实现:
接口是抽象类的延申,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。即全部都是抽象方法。
[修饰符]interface 接口名[extends 父接口名列表]{
[public] [static] [final]常量;
[public] [abstract] 方法;
}
一个类实现一个接口可以使用implements关键字
说明:在接口中定义的任何变量都自动是static和final的,因此,在接口中定义变量时,必须进行初始化,而且,实现接口的子类不能对接口的变量重新赋值。
运行结果
说明:由于接口中的方法都是抽象的,因此,当子类实现接口时,必须实现接口中所有的方法。
多重继承:在java中不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时实现多个接口。
class 类名 implements 接口1,接口2,接口3...接口n
运行结果
注意:使用多重继承时,可能出现变量或方法名冲突的情况,解决该问题时,如果变量冲突,则需要明确指定变量的接口,即通过”接口名.变量“实现;如果出现方法冲突时,则只要实现一个方法即可。
区分抽象类和接口:
访问控制符
注意:声明类时,如果不使用public修饰符设置类的权限,则默认该类为default修饰
使用访问控制符时,需要遵循以下原则。
(1)大部分顶级类都使用public修饰;
(2)如果某个类主要用作其他类的父类,该类中包含的大部分方法只是希望被其子类重而不想被外界直接调用,则应该使用protected修饰;
(3)类中的绝大部分属性都应该使用private修饰,除非一些static或者类似全局变量的加才考虑使用public修饰;
(4)当定义的方法只是用于辅助实现该类的其他方法(即工具方法),应该使用private(5)希望允许其他类自由调用的方法应该使用public修饰.
java类包:
在Eclipse中创建类时,可以在新建立的包上单击鼠标右键,选择Mo建的类会默认保存在该包中。另外也可以在New Java Class对话框中指定新意在Java中包名设计应与文件系统结构相对应,如一个包名为commingly、
位于com文件夹下的 mingrisoft 子文件夹下。没有定义包的类会被归纳在预设2实际开发中,应该为所有类设置包名,这是良好的编程习惯。
在类中定义包名的语法如下:
package包名1[.包名2[.包名3...]];
在上面的语法中,包名可以设置多个,包名和包名之间使用.分割,包名的付前面的包名包含后面的包名。
在类中指定包名时需要将package放置在程序的第一行,它必须是文件中曾当使用package关键字为类指定包名之后,包名会成为类名中的一部分。
import 包名1[.包名2[.包名3...]].类名;
final关键字
定义为final的类不能被继承
final class 类名{}
运行结果
final方法:定义为final的方法不能被重写。
运行结果
final变量:final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该量的值。通常,有final定义的变量为常量
final关键字定义的变量必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组也可以被看作一个对象来引用,所以final可以修饰数组。一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,无法将其改变以指向另一个对象。一个既是static又是final的字段只占据一段不能改变的存储空间。为了深入了解final关键字,来看下面的实例。
运行结果
运行结果
内部类:
1.成员内部类
在内部类可以随意使用外部类的成员方法以及成员变量。
运行结果:
无结果
内部类向上转型为接口
运行结果
使用this关键字获取内部类与外部类的引用:
无运行结果。
局部内部类:
内部类不仅可以在类中进行定义,也可以在类的局部位置定义。
无运行结果
匿名内部类
使用匿名内部类时应该遵循以下原则:
(1)匿名类没有构造方法;
(2)匿名类不能定义静态的成员;
(3)匿名类不能用private、public、protected、static、final、abstract等修饰;
(4)只可以创建一个匿名类实例。
静态内部类:用static 修饰的类
静态内部类具有以下两个特点:(1)如果创建静态内部类的对象,不需要创建其外部类的对象;
(2)不能从静态内部类的对象中访问非静态外部类的对象。
无运行结果。
内部类的继承:
无运行结果。