javaObject
一、 Java面向对象
从客观系统的描述分类,程序设计语言分为面向过程语言和面向对象语言。面向过程语言以“数据结构+算法”程序设计范式构成,如Basic,c等。
以“对象+消息”程序设计范式构成的程序设计语言,称为面向对象语言。比如,java,c++,vb等。面向对象的语言依据现实世界的组成,以事物为中心设计,具有更接近人类思维、可封装提高信息隐藏性和重用性高的特点。根据现实世界事物具有静态属性和动态动作的特点,面向对象的语言也为对象设计了属性和方法两个基本成员。为了进一步提高面向对象的重用性,引入了类的概念,即将对象中公共的成员抽象为一个类。简单的说,类就是具有相同属性和方法的一组对象的集合,如男人和女人都属于人类,猫狗都是动物类。类构成了java程序的基本组织单元。在java中,使用某个类下的对象,可以通过实例化类来完成,一般使用new关键字。实例化的对象可以调用类中非私有的成员。
二、 类的创建与实例化
- 一般,类通过class关键字创建,通过其他关键字可以设置类的一些特性,如访问权限,静态与否,抽象与否,同步与否。类的成员包括属性和方法,另外还有用于实例化类的构造方法,构造方法是一种特殊的方法,创建类时没有写构造方法则采用程序默认的无参构造方法。
创建类的例子:
public class Dog {
public Stringname;
public intage;
public Dog(){
System.out.println("无参的构造方法");
}
public voidchi(){
System.out.println(name+"狗吃");
}
}
测试
public voidtest1(){
Dog d=new Dog();
d.name="匹配";
d.chi();
}
- 构造方法的重载
一个类可以有多个构造方法,以便创建不同需求的实例对象。构造方法的重载指,方法名相同,参数列表不同。其中,参数列表不同指参数的个数和类型上的不同。
例子:
创建多个构造方法的类
public class Person {
public Stringname;
public intage;
public Person(){
System.out.println("无参的构造函数");
}
public Person(Stringname){
System.out.println("一个参数的构造函数");
}
public Person(Stringname,intage){
System.out.println("两个参数的构造函数");
}
}
测试
public voidtest2(){
Person p1=new Person();
Person p2=new Person("看看");
Person p3=new Person("看看",13);
}
三、 Java面向对象的特征
(一) 封装
封装就是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的步骤:1,把要封装的成员属性的访问权限设为private;2,在类中提供set方法以便设置属性值,可以使用this关键字,简化代码;3,提供get方法以便获取属性值。
this关键字表示本类的对象。
例子:
创建进行了封装的类
public class Dog {
private Stringname;
private intage;
public voidsetName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public intgetAge() {
return age;
}
public voidsetAge(intage){
this.age =age;
}
public Dog(){
System.out.println("无参的构造方法");
}
public voidchi(){
System.out.println(name+"狗吃");
}
}
测试
public voidtest1(){
Dog d=new Dog();
d.setName("浏览");
System.out.println(d.getName());
d.chi();
}
(二) 继承
- 继承是从已有的类中派生出新的类,新的类能吸收已有类的成员属性和行为,并能扩展新的能力。Java不支持多继承,一个类只能有一个父类。继承具有传递性,如果继承的父类也继承了这个父类的父类,这可以继承父类的父类,但是不允许递归继承。使用继承可以避免对一般类和特殊类之间共同特征进行的重复描述。继承具有传递性,使用方法的重写可以提高复用功能,继承有利于维护。
例子:
创建父类和子类
public class Animal {
public Stringname;
public intage;
private Stringsex;
public voideat(){
System.out.println(name+"在吃");
}
private voidwang(){
System.out.println(name+"在旺旺");
}
}
public class Dog1 extends Animal{
}
public class Cat extends Animal{
}
注意:子类不能继承父类私有的成员,子类与父类非同包而父类中使用默认访问权限的成员,父类的构造方法。
- 子类访问父类成员,使用super关键字。
例子:
创建父类和子类
public class Animal {
public Stringname="哈哈";
public intage;
private Stringsex;
public voideat(){
System.out.println(name+"在吃");
}
private voidwang(){
System.out.println(name+"在旺旺");
}
}
public class Cat extends Animal{
public Stringname;
public Cat(){
//调用父类的构造方法,只能出现在构造方法的第一行。
super();
}
public voidcat(){
System.out.println(name+"是cat的name");
System.out.println(super.name+"是父类的name");
}
}
测试
public voidtest4(){
Cat c=new Cat();
c.name="kitty";
c.cat();
}
- 关于java中访问权限
不同的访问权限,提供了对访问的控制。见下表。
访问修饰符 | 本类 | 同包 | 字类 | 其他 |
private | √ |
|
|
|
默认(default)可以缺省 | √ | √ |
|
|
protected | √ | √ | √ |
|
public | √ | √ | √ | √ |
例子略。
- 子类重写父类方法
如果子类根据自身的特殊性,需要对父类中的方法进行修改后使用,可以使用方法的重写实现。
方法重写的要求:1,重写的方法和被重写的方法具有相同的方法名;2,重写的方法与被重写的方法具有相同的参数列表;3,重写的方法的返回值类型和被重写方法的返回值类型相同或者是其子类;4,重写的方法不能缩小被重写方法的访问权限。
注意:由于构造方法不能被继承,所有不能重写构造方法。
例子:
创建父类和子类
public class Animal {
public Stringname="哈哈";
public intage;
private String sex;
public voideat(){
System.out.println(name+"在吃");
}
private voidwang(){
System.out.println(name+"在旺旺");
}
}
public class Dog1 extends Animal{
public voideat(){
System.out.println(name+"狗自己的方法");
}
}
测试
public voidtest5(){
Dog1 d=new Dog1();
d.name="Kk";
d.eat();
}
(三) 抽象
抽象就是对显示的一类事物,抽取其特点,并把这些特点整合在一起,提取为类来表示这类事物。Java中使用abstract关键字表示抽象的类。抽象类中可以没有成员,如果有成员方法是抽象的方法,如果有子类的话,要在其子类中重写这个抽象方法为非抽象的,除非这个子类也是抽象类。
没有成员的抽象类的例子:
创建抽象类及其子类
public abstract class Animal2 {
}
public class Cat1 extendsAnimal2{
}
具有成员的抽象类的例子:
创建抽象父类和子类
public abstract class Animal2 {
String name;
int age;
public voidtest(){
}
abstract voidtest2();
}
public class Cat1 extends Animal2{
@Override
void test2() {
System.out.println("来自抽象父类的抽象方法");
}
}
测试
public voidtest6(){
Cat1 c=new Cat1();
c.test2();
}
(四) 多态
方法的重写、重载和动态链接构成多态性。Java只允许单继承,虽然保证了继承关系的简单明了,但是功能上有很大的限制,java的多态弥补了这个限制性。自动向上转型,帮助实现了多态性,即将父类的引用指向子类的对象,自动从小的类转成大的类型。
例子:
创建父类和子类
public class Animal {
public Stringname="哈哈";
public intage;
private Stringsex;
public voideat(){
System.out.println(name+"在吃");
}
private voidwang(){
System.out.println(name+"在旺旺");
}
}
public class Dog1 extends Animal{
public Stringname="wang";
public voiddog(){
System.out.println(name+"多态中子类狗特有的方法");
}
}
public class Cat extends Animal{
public Stringname="miao";
public Cat(){
//调用父类的构造方法,只能出现在构造方法的第一行。
super();
}
public voidcat(){
System.out.println(name+"是cat的name");
System.out.println(super.name+"是父类的name");
}
public voidcat2(){
System.out.println(name+"多态中子类猫特有的方法");
}
}
测试
public voidtest7(){
Animal dog=new Dog1();
Animal cat=new Cat();
test8(dog);
test8(cat);
}
public voidtest8(Animal a){
a.eat();
if(ainstanceofDog1){
((Dog1)a).dog();
}
if(ainstanceofCat){
((Cat)a).cat2();
}
}
注意:多态的方法提高了代码的复用性和扩展性,但是多态的对象不能使用子类特有的成员,如果使用,需要向下强制转换。
四、 接口
- 在java中,接口是一个抽象类型,是抽象方法的集合。接口无法被实例化,但可以被实现,一个实现接口的类,必须实现接口内所有方法,否则必须声明此类为抽象类。接口可以继承接口,支持多继承。接口可以用来声明变量。
例子:
创建一个接口
public interface Interface1 {
public Stringname="hah";
public voidinter1();
}
创建一个实现类
public class InterfaceClass1 implements Interface1{
@Override
public voidinter1() {
System.out.println("实现了一个接口");
}
}
- 一个类可以同时实现多个接口
例子:
创建两个接口
public interface Interface1 {
public Stringname="hah";
public voidinter1();
}
public interface Interface2 {
public Stringname="hah";
public voidinter2();
}
创建一个实现类
public class InterfaceClass1 implements Interface1,Interface2{
@Override
public voidinter1() {
System.out.println("实现了一个接口");
}
@Override
public voidinter2() {
System.out.println("实现了另一个接口");
}
}
- 一个接口可以继承多个接口
例子:
创建两个接口
public interface Interface1 {
public Stringname="hah";
public voidinter1();
}
public interface Interface2 {
public Stringname="hah";
public voidinter2();
}
创建一个接口继承多个接口
public interface Interface3 extends Interface1,Interface2{
public Stringname="hah";
public voidinter3();
}
注意:如果一个类实现了一个具有继承关系的接口,则这个实现类要实现所有继承的接口的方法和本接口的方法。
如:
public class InterfaceClass2 implements Interface3{
@Override
public voidinter1() {
// TODO Auto-generated methodstub
}
@Override
public voidinter2() {
// TODO Auto-generated methodstub
}
@Override
public voidinter3() {
// TODO Auto-generated methodstub
}
}
- 接口不能被实例化,要使用接口需要通过实例化这个接口的类实现,接口支持多态。
例子:
创建接口和实现类略
public voidtest9(){
InterfaceClass1 in=new InterfaceClass1();
in.inter1();
//使用多态的方式
Interface1 in1=new InterfaceClass1();
in.inter1();
}
- 一个类可以同时继承一个类并实现接口
例子:
public class InterfaceClass1 extends Animalimplements Interface1,Interface2{
@Override
public voidinter1() {
System.out.println("实现了一个接口");
}
@Override
public voidinter2() {
System.out.println("实现了另一个接口");
}
}
五、 static和final关键字
- static关键字
static,静态的意思,用于修饰类的成员,表示被修饰的成员是静态的。声明为静态的成员,属于类所有,不是个别的对象。由于static的成员被类所有,可以使用类名.成员名来调用静态的成员。静态的方法不能调用非静态的方法或属性。构造方法不能使用static修饰。
例子:
创建含静态成员的类
public class StaticTest {
public staticString name;
public staticvoidtest1(){
System.out.println(name+"这是静态的方法");
//test2();
}
public voidtest2(){
test1();
}
/*public staticStaticTest(){
//构造方法不能使用static
System.out.println("无参的构造方法");
}*/
}
测试
public voidtest10(){
StaticTest.name="haha";
StaticTest.test1();
}
static也可以修饰代码块,表示静态代码块。静态代码块在类加载的时候,完成初始化。
例子:
创建带有静态代码块的类
public class StaticTest {
public staticString name;
public staticvoidtest1(){
System.out.println(name+"这是静态的方法");
//test2();
}
public voidtest2(){
test1();
}
/*public staticStaticTest(){
//构造方法不能使用static
System.out.println("无参的构造方法");
}*/
static{
name="hihi";
System.out.println("这是静态代码块");
}
}
测试
public voidtest11(){
StaticTest.test1();
}
- final关键字
final表示最终的,可以修饰类,方法和属性。使用final修饰的类不能被继承;final修饰的方法不能被重写,但是可以被继承;final修饰的变量,代表变量不能被改变,所以又称之为常量,一般将常量名大写,如果是两个单词,则以_分割,如PI,STU_NAME。
例子:
public final class FinalTest {
public finalString NAME="会话";
public finalvoidtest1(){
System.out.println("无返回值,不能被重写的final方法");
}
public finalint test2(){
System.out.println("有返回值,不能被重写的final方法");
return 1;
}
}
还没有评论,来说两句吧...