Java定义class

1 final

final可以用来修饰 类、方法 和 变量。

  • 修饰类:表明这个类不能被继承;
  • 修饰方法:使用final方法的原因是把方法锁定,以防任何继承类修改它的含义。因此,如果想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final的。类的private方法会隐式地被指定为final方法。
  • 修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

2 abstract

  • abstract修饰符表示所修饰的类没有完全实现,还不能实例化。
  • 如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。
  • 如果一个类包含抽象函数,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。
  • 通过上面不难推断出,如果一个类继承了一个抽象类,但是并没有实现这个抽象类中的所有抽象方法,那么,它也是一个抽象类,也必须用abstract声明。
  • 很明显,abstract没法final一起使用

3 static

不能修饰类,只能修饰成员,声明这个成员是属于类的

  • 修饰方法:声明为类方法,调用时就只能用类调用,不能用实例调用;
  • 修饰成员变量:声明为类变量,同上。

4 权限控制

  • private:当前类访问权限
  • default:包访问权限
  • protected:子类访问权限。一般把一个方法用它修饰是希望子类重写这个方法。
  • public:公共访问权限

5 多态

Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时指定的类型决定。运行时类型由赋值给该引用变量的对象的类型决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态。

因为子类实际上是一种特殊的超类,因此,Java允许把一个子类对象直接赋值给一个父类的引用变量。这种向上转型系统自动完成。这时,相同类型的变量(编译类型),调用同一个方法时呈现不同的行为特征,这就是多态。例如:

void displayPersonalInfo( Person p){
………………
//Person类中定义的变量
p.display();
………………
}

//Student和Teacher都继承了Person
Student s = new Student();
Teacher t = new Teacher();
displayPersonalInfo(s);
displayPersonalInfo(t);

如果Student和Teacher分别对display函数重写了,输出结果可以不一样的。但是这里要注意一个问题:

“Person p” 中的p只能调用Person中定义的方法,是不能调用Teacher或是Student中才有的方法的。

但是,你就是任性的要用Person的指针调用Student和Teacher中才有的方法,怎么办呢? 强制转换。

6 组合

使用继承extends时有一个问题就是会破坏超类的封装性,子类一般可以任意串改超类的实现。而组合可以解决这个问题。

所谓组合,其实就是在一个新类当中声明一个另一个类的对象,从而把这个对象看做新类的一部分。由于使用组合往往是为了保护封装性,所以一般用private修饰。

当然,从抽象意义上来讲,继承关系是“is-a”,组合关系是“has-a”。

7 你忽略的事

(1)构造函数有返回值,不过是隐式的。
(2)Java里的方法不能单独存在,只能出现在类中。
(3)java中没有C++中的“硬拷贝”、“软拷贝”,只有一种,软的,值传递:

    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a + "");
        System.out.println(b + "");

        System.out.println();

        swap(a, b);
        System.out.println(a + "");
        System.out.println(b + "");
    }
    public static void swap(int i1, int i2) {
        int tmp = i1;
        i1 = i2;
        i2 = tmp;
    }

运行结果:
这里写图片描述

(4)当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并赋予初值;但是,如果是局部变量,仅仅声明,没有初始化是不会分配内存的。比如:在一个方法中声明:int a;这个是在初始化之前在内存中是不存在的。

(5)import static 的作用是导入静态成员(变量和方法)。

(6)this 和 super 不能出现在static修饰的方法中。

(7)当实例化一个类的时候,系统会为这个类的实例分配一块内存,同时,也会为它的超类相应的实例分配一块内存。

(8)子类extends超类之后,如果定了与超类同名的变量或是方法,会掩盖超类的成员,但,不是覆盖,还是可以用super调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值