AnthonyCJ's Blogs

Find your passion, and you'll feel the light.

JavaSE-4-面向对象-2

JavaSE-学习笔记,主要内容为 static 关键字、面向对象三大特性(封装、继承、多态)-继承相关知识,访问修饰符,final关键字。

1. static 关键字

  • 静态(static)可以修饰属性和方法。
  • 称为静态属性(类属性)、静态方法(类方法)。
  • 静态成员是全类所有对象共享的成员
  • 在全类中只有一份,不因创建多个对象而产生多份。
  • 不必创建对象,可直接通过类名访问。

1.1 静态属性

  • 静态属性,不再属于对象。
  • 非静态属性(实例属性)属于对象,随着对象的创建而产生,每个对象的属性值都是独立的。

静态属性是属于类的,只有一份(节省内存)。应该由类来访问,但是对象也可以访问,所有的对象共享着一份数据。

非静态属性由对象访问:对象.属性 –> 赋值,取值
静态属性由类访问:类名.静态属性 –> 赋值,取值

静态属性可以和final搭配使用,形成静态常量


1.2 静态方法

形成了静态方法。属于类而不再属于对象,通过类名来调用即可,通过对象也可以调用 。

  • 在静态方法中:只能访问属于类的资源,不能访问属于对象的资源(因为静态资源会直接被加载到内存中,而非静态资源不一定被 new 出来
    • 可以访问静态属性
    • 可以访问静态方法
    • 不能直接访问非静态属性
    • 不能直接访问非静态方法

1.3 静态代码块

代码块:使用{}包裹起来的一段代码。

  • 普通代码块:{}包裹起来一段代码。注意作用域。
  • 构造代码块:写在类里,方法外的代码块,就叫构造代码块。当创建对象的时候,随着构造函数的调用而执行。而且优先于构造函数执行。构造函数被多次调用,那么构造代码块也被多次调用。
  • 静态代码块:用 static 关键字修饰的代码块。在类第一次使用的时候执行,优先于main的执行。只执行一次。例如连接数据库的驱动等
  • 同步代码块:多线程。

优先级别:静态代码块 > 构造代码块 > 构造方法



2. 继承

2.1 概念

继承的概念:描述两个类的关系的。在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类(派生类,SubClass),现有类被称作父类(超类,SuperClass),子类会自动拥有父类所有非私有的属性和方法

意义:

  1. 避免重复的代码。(从子类的角度)
  2. 扩展类的功能。(从父类的角度)

继承性:子类,父类。存在继承关系。

  • 子类对象,可以直接访问父类的非私有的属性和方法。(避免重复代码)
  • 子类也可以新增自己的属性和方法。(扩展类的功能)
  • 子类可以重新实现父类已有的方法。(扩展类的功能)

2.2 语法

语法结构

1
2
3
4
5
6
7
class SuperClass {

}

class SubClass extends SuperClass {

}

extends 关键字:表示两个类是继承关系。


2.3 继承中的构造方法

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class Animal {
private String type;
int age;
String color;

public Animal(){
System.out.println("父类Animal无参构造函数......");
}

public Animal(String type, int age, String color) {
System.out.println("父类Animal有参构造函数......");
this.type = type;
this.age = age;
this.color = color;
}

public void eat(){
System.out.println("动物吃东西.....");
}

public void print(){
System.out.println("type:"+type+";age:"+age+";color:"+color);
}
}

//继承父类非私有的属性和方法
public class Cat extends Animal{

public Cat(){
System.out.println("子类Cat无参构造......");
}

public Cat(String type,int age,String color,String name){
super(type,age,color);//super()指代父类构造函数的时候,也只能放在第一句,如果显式调用了某个构造函数,就不会默认调用无参构造了
System.out.println("子类Cat有参构造函数......");

this.age = age;
this.color = color;
this.name = name;
}

//新增一些属性和方法
String name;

//重新实现父类的方法
@Override//相当于加了约束,
public void eat(){
System.out.println("猫吃鱼........");
}

public void catchMouse(){
System.out.println("抓老鼠......");
}
}

2.4 super 关键字

子类对象的创建过程:
子类的构造方法中,默认先调用父类的无参构造方法。如果没有显示的调用,那么隐含 super(); 的调用。

  • super 关键字
    • 可以访问父类的属性
    • 可以访问父类的方法
    • 指代父类的构造方法, 如果有多个,靠参数来区分。要放在第一行进行调用
  • this 关键字:作为本类的对象
    • 访问本类的属性。如果在继承中,本类没有这个属性,那么再从父类中寻找对应的属性
    • 访问本类的方法
    • 可以指代本类的构造方法:this()。要放在第一行进行调用

thissuper 对比

比较内容 this super
访问属性时 首先在子类中匹配,如果没有就在父类中匹配 直接访问父类的属性
访问方法时 首先在子类中匹配,如果没有就在父类中匹配 直接访问父类中的方法
调用构造方法时 通常用于在本类中的一个构造方法中通过this()调用本类的另一个构造方法 调用父类的构造方法
特殊作用 指自身的引用

注意:this, super关键字,均不能出现在static方法中。


2.5 方法重写(重点)

表示方法重写的关键字:override

概念:继承关系中,子类将父类已有的方法重新实现,叫做方法的重写。

  • 规则
    • override只存在于继承关系中。
    • 子类重写的方法的声明(方法的返回值、参数列表、方法名),必须和父类一致。
      • 注意:子类重写的方法的返回类型可以是父类方法返回类型的子类
    • 子类重写方法的访问权限,不能比父类更加严格。
    • 重写的方法,不能抛出比父类更大的异常(子类抛出的异常更精确)。

易混概念:重载 overload
重载:一个方法,因为参数不同,执行的具体的方法也不同。

  • 规则
    • 重载的方法与原方法处于同一个类中。
    • 方法名必须一致。
    • 参数列表必须不同:顺序,个数,类型。
比较内容 重写 重载
注解 @Override
范围 继承(子类) 同一个类中
对方法的要求 和父类的方法名一致,参数列表一致,返回类型一致 方法名一致,参数列表不同,返回值类型无要求
对访问权限的要求 不能比父类的访问权限更严格 对访问权限无要求



3. 访问修饰符

访问权限:对类,方法,变量,常量等访问位置的限定。通过访问权限修饰符来实现。

在Java中,可以在类、类的属性以及类的方法前面加上一个修饰符(modifier),来对类进行一些访问上的控制。

  • private:私有的,限制在当前类中才能访问。
  • default:无修饰符,就是default。同类,同包。
  • protected:受保护的,同类,同包,不同包(仅限于子类访问)
  • public:公共的,同类,同包,不同包。

访问权限:private < default < protected < public



4. final 关键字

  • final可修饰的内容:
    • 类(最终类)
    • 方法(最终方法)
    • 变量(最终变量)

final 修饰类:此类不能被继承。String、Math、System 均为 final 修饰的类,不能被继承。
final 修饰方法:此方法不能被覆盖。意为最终方法,不支持子类以覆盖的形式修改。
final 修饰变量:此变量值不能被改变(常量)。所有 final 修饰的变量只能赋值一次,值不允许改变。

  • final 修饰基本类型:值不可变。
  • final 修饰引用类型:地址不可变。
  • 静态常量不会隐式地提供默认值,必须手动赋予初始值。
用爱发电,无需打赏哦~